Skip to content

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);
    }
  }
};