下午折腾了两个纯前端二维码工具:一个识别器、一个生成器。记录下调试过程中踩过的几个坑,免得以后重复踩。
用的是 jsQR。识别英文二维码没问题,但中文二维码识别结果直接为空。
查了下,jsQR 返回的对象里有两个字段:
code.data:legacy 字符串,对多字节字符支持不好code.binaryData:原始字节数组
正确做法是用 binaryData 配合 TextDecoder 按 UTF-8 解码:
function decodeQRData(code) {
if (code.binaryData && code.binaryData.length) {
const bytes = new Uint8Array(code.binaryData);
return new TextDecoder('utf-8').decode(bytes);
}
return code.data || '';
}
图片识别和摄像头扫码两处都要走这个解码逻辑。
生成器中 qr.addData(value) 对中文支持不行,需要先做一次 UTF-16 到 UTF-8 的字节转换: