You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成支付二维码时西里尔文内容乱码问题求助

解决西里尔文在二维码链接中显示为问号的问题

问题根源

你遇到的问题是因为qrgen依赖的ZXing库默认编码字符集可能为ISO-8859-1,无法正确处理西里尔文这类非ASCII字符;同时URL中的非ASCII字符未经过规范编码,导致生成二维码后字符丢失变为问号。

无需更换库的修复方案

1. 对URL中的西里尔文部分做UTF-8编码

不要直接使用原始URL生成二维码,先对包含西里尔文的片段做URL编码(注意不要编码整个URL的协议、域名部分,只处理路径或参数里的特殊字符):

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

// 原有代码中生成linkUrl之后添加编码逻辑
String linkUrl = bnplUrlService.getBnplUrl(bnplDto);
// 示例:如果linkUrl是包含参数的完整URL,需单独编码参数值
// 假设linkUrl格式为 "https://your-domain.com/pay?address=ул. Астана 58А&order=123"
// 拆分后仅对address参数的值编码,再拼接回完整URL
// 若linkUrl就是纯内容链接,直接编码(但注意避免编码协议部分)
String encodedLinkUrl = URLEncoder.encode(linkUrl, StandardCharsets.UTF_8.name());

2. 强制QRCodeWriter使用UTF-8字符集

修改你的getQrCodeHintMap()方法,添加字符集指定,确保ZXing用UTF-8编码内容:

private Map<EncodeHintType, Object> getQrCodeHintMap() {
    Map<EncodeHintType, Object> hintMap = new HashMap<>();
    // 核心:指定UTF-8字符集
    hintMap.put(EncodeHintType.CHARACTER_SET, StandardCharsets.UTF_8.name());
    // 保留原有其他配置(如纠错级别)
    hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    return hintMap;
}

3. 使用编码后的URL生成二维码

将qrCodeWriter.encode()方法的第一个参数替换为编码后的URL:

BitMatrix bitMatrix = qrCodeWriter.encode(encodedLinkUrl, BarcodeFormat.QR_CODE, 250, 250, getQrCodeHintMap());

验证

扫描生成的二维码后,解析出的URL应能正确显示西里尔文,不再出现问号;同时确保解析后的URL能正常访问对应页面。


内容的提问来源于stack exchange,提问作者Dmitriy Gerassimenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:02:26