JavaScript QR Code 使用 jquery-qrcode 插件显示含中文的二维码
🏷️ jQuery JavaScript
虽然按照 使用 jquery-qrcode 生成二维码 写上去了,但是还是乱码。
后来把页面文件的编码格式改成 utf8 之后,再刷新二维码就对了。
另外在 github 上还找到了另外一种实现方法(也要改文件的编码格式):https://github.com/jeromeetienne/jquery-qrcode/issues/13
顺便吐槽下 Sublime Text 的国际化支持,实在是太挫了。有中文字符时不知道保存成啥格式了,浪费了大半天时间。
方法 1
js
function utf16to8(str) {
var out, i, len, c;
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;
}
jQuery(function(){
jQuery('#output').qrcode(
{
correctLevel:0,
//text:utf16to8("MECARD:\r\nN:姓名;\r\nTEL:电话号码;\r\nEMAIL:邮箱;\r\n;")
text:utf16to8("BEGIN:VCARD\r\nVERSION:3.0\r\nN:姓名;\r\nTEL;TYPE=WORD,VOICE,PREF,MSG:电话号码\r\nEMAIL;TYPE=PREF,INTERNET:邮箱\r\nEND:VCARD")
}
);
});
方法 2
js
var _countBits = function(_c) {
var cnt = 0;
while(_c > 0) {
cnt++;
_c = _c >>> 1;
}
return cnt;
};
function UnicodeToUtf8Bytes2(code) {
if ((code == null) || (code < 0) ||
(code > (Math.pow(2, 31) -1))) {
return ["?".charCodeAt(0)];
}
if (code < 0x80) {
return
;
}
var arr = ;
while ((code >>> 6) > 0) {
arr.push(0x80 | (code & 0x3F));
code = code >>> 6;
}
if ((arr.length + 2 + (_countBits(code))) > 8) {
arr.push(0x80 | code);
code = 0;
}
var pre = 0x80;
for (var i = 0; i < arr.length; i++) {
pre |= (0x80 >>> (i + 1));
}
arr.push(pre | code);
return arr.reverse();
}
QR8bitByte.prototype.getLength = function(buffer) {
var len = 0;
for (var i = 0; i < this.data.length; i++) {
var bytes = UnicodeToUtf8Bytes2(this.data.charCodeAt(i));
len += bytes.length;
}
return len;
};
QR8bitByte.prototype.write = function(buffer) {
for (var i = 0; i < this.data.length; i++) {
var bytes = UnicodeToUtf8Bytes2(this.data.charCodeAt(i));
for (var x = 0; x < bytes.length; x++) {
buffer.put(bytes[x], 8);
}
}
};