首页 > 建站教程 > JS、jQ、TS >  关于qrcode.js生成二维码中中文会乱码的解决方法正文

关于qrcode.js生成二维码中中文会乱码的解决方法

qrcode.js生成二维码,代码如下:

$(".output").qrcode("http://中文中文");


如下图,再扫码出来,中文出现了乱码:

关于qrcode.js生成二维码中中文会乱码的解决方法


官方,给出了解决方案,那就是先将中文字体转码:

$(".output").qrcode(encodeURI("http://中文中文"));


这样别人扫出来,还得解码,显然不行。


中文乱码的原因在于,qrcode只是单纯采用charCodeAt()方式获取字符的Unicode编码进行转换,转换后并未处理中文字符编码(charCodeAt 是采用UTF-16编码制),所以他会出现中文乱码的问题;而下面的方法在转换为Unicode编码后,输出时再对中文字符编码进行fromCharCode代理,转为UTF-8,然后再生成二维码。

function toUtf8(str) {
    var out,//输出
        i,//字符索引
        len,//长度
        c;//charCodeAt 编码后的字符
    out = "";
    len = str.length;
    for(i = 0; i < len; i++) {
        c = str.charCodeAt(i);
        if((c >= 0x0001) && (c <= 0x007F)) {
            out += str.charAt(i);
        } else if(c > 0x07FF) {
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
            out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
        } else {
            out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
        }
    }
    return out;
}


再次生成二维码:

$(".output").qrcode(toUtf8("http://中文中文"));


这样就没问题了。