import qrcode
qr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=10, border=4)
qr.add_data("限时优惠".encode("utf-8"))
qr.make(fit=True)
qr.make_image().save("promo.png")
活动页二维码里带「限时优惠」四个字,微信扫出来显示 ???,英文和数字内容正常。同样的字符串在在线工具生成却没问题,版本 4 的码,纠错级别 M。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:qrcode 库默认按字节模式写入,字符串先被 encode 成 latin-1,中文直接变成问号。扫码端拿到的字节流不是 UTF-8,解出来只能是替换字符。英文落在 ASCII 范围内,所以看不出问题。
围绕「二维码中文乱码」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同一份配置存在多处的,先确认改的是被加载的那一份。
处理上按这个顺序:生成前把内容 encode 成 UTF-8 再 add_data;确认库版本支持 byte 模式中文 老版本要手动指定;生成后自己扫一遍 内容包含中文才算通过;带中文的码适当提高纠错级别 容量不够就升版本。
确认没问题再收工,微信和支付宝各扫一次都能显示「限时优惠」四个字,不再出现问号。
