qrcode.js生成二维码,代码如下:
$(".output").qrcode("http://中文中文");
如下图,再扫码出来,中文出现了乱码:
官方,给出了解决方案,那就是先将中文字体转码:
$(".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://中文中文"));
这样就没问题了。