首页 » Web技术 » JS/jQuery » 正文

[Share]分享一款jQuery二维码生成插件jquery-qrcode

现在,二维码在我们生活中出现的频率越来越高,购物、看电影等等很多地方都会用的。今天发现一款用jQuery生成二维码的小插件–jquery.qrcode.js,分享给大家。

jquery.qrcode.js是一款专门为浏览器生成二维码的jQuery小插件。它能让你方便的为网页添加二维码。它是独立的,gzip压缩后只有4k大小,并且不需要下载图片。它其实是通过使用jQuery实现图形渲染、画图,支持canvas(HTML5)和table两种方式,您可以到https://github.com/jeromeetienne/jquery-qrcode获取最新的代码。

使用方法

1. 引入jQuery库文件及jquery-qrcode插件

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.qrcode.min.js"></script>

2. 在页面中创建一个DOM元素,用来显示生成的二维码,比如我们创建下面的div

<div id="qrcode"></div>

3. 调用 jquery-code 生成二维码

$('#qrcode').qrcode("https://9iphp.com");

生成的二维码如下:

jquery_qrcode

同时,jquery-code 还提供了一些其他参数,供我们定制不同的样式。默认参数如下,我们可以修改其值来生成不同样式的二维码。

$('#qrcode').qrcode({
    render: 'canvas', // 可选 "table" 和 "canvas"
    width: 256,
    height: 256,
    text: 'https://9iphp.com', //二维码内容
    typeNumber  : -1, //计算模式
    correctLevel    : 2, //纠错等级
    background      : "#ffffff", //背景颜色
    foreground      : "#000000" //前景颜色
});

4. 添加中文支持

其实上面的js有一个小小的缺点,就是默认不支持中文。这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下(参考来源):

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

之后,我们在生成二维码前,把要生成的字符串先转换下编码就可以了。如下:

$('#qrcode').qrcode(utf16to8("就爱PHP"));

 

最后附带一个 UTF-8 转 UTF-16 编码的js方法:

function utf8to16(str) {
    var out, i, len, c;
    var char2, char3;

    out = "";
    len = str.length;
    i = 0;
    while (i < len) {
        c = str.charCodeAt(i++);
        switch (c >> 4) {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
                // 0xxxxxxx
                out += str.charAt(i - 1);
                break;
            case 12:
            case 13:
                // 110x xxxx   10xx xxxx
                char2 = str.charCodeAt(i++);
                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                break;
            case 14:
                // 1110 xxxx  10xx xxxx  10xx xxxx
                char2 = str.charCodeAt(i++);
                char3 = str.charCodeAt(i++);
                out += String.fromCharCode(((c & 0x0F) << 12) |
                    ((char2 & 0x3F) << 6) |
                    ((char3 & 0x3F) << 0));
                break;
        }
    }

    return out;
}

 

发表评论