生成支付二维码时西里尔文内容乱码问题求助
解决西里尔文在二维码链接中显示为问号的问题
问题根源
你遇到的问题是因为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
相关产品推荐
相关产品推荐

