通過jquery-qrcode在線生成二維碼


隨着移動互聯網的發展,二維碼現在應用得越來越廣泛了,隨手掃掃就可以瀏覽網站、加個好友什么的,比起手工輸入真的是方便太多了。

前期做了一個綜合測評系統,考慮逐步實現移動化,一長串的IP地址用戶輸入也不方便,借助二維碼的話,用戶拿起手機掃掃就可以直接進入系統。

基於這個應用場景,就上網研究下了網站二維碼的實現方式,歸納起來有以下兩種:

1、借助一些二維碼生成網站或者二維碼生成器生成二維碼圖片,然后掛在網站上,如碼雲 QR-Code (二維碼) 在線生成器

優點:開發成本為零,能夠快速實現多樣化的二維碼;

缺點:變更二維碼的維護略顯麻煩

2、在后端利用java或.net代碼生成二維碼圖片,再在網站上引用圖片,如qrcode、zxing等

優點:可定制性強,可快速批量生成

缺點:重量級實現方式,對於簡單應用來講開發成本較高

3、在前端頁面通過javascript等方式即時生成為二維碼(ˇ?ˇ) ,如jquery-qrcode

優點:輕量級實現方式,減少圖片IO,節省流量

缺點:不適合復雜二維碼的生成

當然在實際應用中,這三種實現方式也不是完全孤立的,我們也可以根據項目實際情況結合應用,最大限度地提高效率、節約成本。

晚上時間也不多就選了個jquery-qrcode研究下。

jquery-qrcode

jquery-qrcode是一個能夠在瀏覽器端生成二維碼的jquery插件。它是獨立的,最小壓縮之后不足4k,也沒有圖片下載請求。引入該類庫之后,只需要一行代碼,就可以很容易在web頁面加上二維碼。

其托管在github上:https://github.com/jeromeetienne/jquery-qrcode

jquery-qrcode主要包含兩個文件:

1、qrcode.js:二維碼算法實現類

2、jquery.qrcode.js:用jquery將qrcode.js封裝起來,根據用戶參數,實現canvas及table兩種方式渲染生成二維碼

壓縮之后的只有一個文件jquery.qrcode.min.js。

代碼實現

github上其實已經有了非常詳細的使用說明及示例,在此就不多做說明了。

不過為了方便今后使用,我還是結合網絡上大家的使用心得重新整理一份代碼。

jquery-qrcode.html代碼如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>通過jquery-qrcode生成二維碼</title>
</head>
<body>
<!-- 引入百度CDN公共庫的壓縮版jQuery -->
<script src="http://libs.baidu.com/jquery/2.0.3/jquery.min.js"></script>
<!--引入壓縮版jquery.qrcode.js -->
<script src="jquery.qrcode.min.js"></script>
<!--未壓縮則需要引入兩個文件jquery.qrcode.js和qrcode.js -->
<!--jquery.qrcode.js:jquery封裝渲染類庫 -->
<!--<script src="jquery.qrcode.js"></script>-->
<!--qrcode.js:二維碼核心計算類庫 -->
<!--<script src="qrcode.js"></script>-->
<script src="jquery.qrcode.min.js"></script>
<!--解決中文亂碼問題,引入utf16t8.js -->
<script src="utf16to8.js"></script>
<p>用canvas渲染(http://www.cnblogs.com/scaleworld/)</p>

<div id="qrcodeCanvas"></div>
<p>用table渲染(量衡天下博客:http://www.cnblogs.com/scaleworld/)</p>

<div id="qrcodeTable"></div>
<script>
    //最簡用法,render默認是canvas
    $('#qrcodeCanvas').qrcode("http://www.cnblogs.com/scaleworld/");
    //完整用法,有默認值的均可省略
    $('#qrcodeTable').qrcode({
        text: utf16to8("量衡天下博客:http://www.cnblogs.com/scaleworld/"),//二維碼包含的內容,默認只支持英文內容,中文會亂碼,通過utf16to8轉碼可支持中文
        render: "table",//渲染方式可選擇canvas或table,默認是canvas,canvas方式還支持右鍵圖片下載
        width: 256,//寬度,默認是256
        height: 256,//高度,默認是256,建議寬度和高度保持一致,否則不容易被識別
        typeNumber: -1,//計算模式,默認是-1
        //correctLevel: QRErrorCorrectLevel.H,//糾錯等級,默認是QRErrorCorrectLevel.H,但是加上correctLevel這一行后無法渲染出二維碼
        background: "#ffffff",//背景顏色,默認是白色
        foreground: "#000000"//前景顏色,默認是黑色
    });
</script>
<body>
</html>

utf16to8.js

基於官方示例測試,我們會發現識別出來的中文二維碼會是亂碼。

根據園友心存善念的解釋:

這跟js的機制有關系,jquery-qrcode這個庫是采用 charCodeAt() 這個方式進行編碼轉換的,

而這個方法默認會獲取它的 Unicode 編碼,一般的解碼器都是采用UTF-8, ISO-8859-1等方式,

英文是沒有問題,如果是中文,一般情況下Unicode是UTF-16實現,長度2位,而UTF-8編碼是3位,這樣二維碼的編解碼就不匹配了。

解決方式當然是,在二維碼編碼前把字符串轉換成UTF-8

因此我們可以借助utf16to8.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;
}

大家也可以上我的github下載這些代碼。

應用效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM