jquery.qrcode.js は、jquery クラス ライブラリで QR コードを描画するためのプラグインで、QR コード グラフィックのレンダリングを実現するために使用され、キャンバスとテーブルの 2 つの描画メソッドをサポートします。 (jquery.qrcode.jsで表示モードをテーブルに設定すると、ChromeなどのWebkit Coreブラウザでは変形してしまいますので注意が必要です。)
以下はテストコードです(カラーコントロールが追加されており、4つのブロックのカラー値を設定でき、レンダリングをテーブルとして指定する必要があります)。効果は次のとおりです:
コードは次のとおりです:
<html> <head> <title>JS生成二维码</title> <script type="text/javascript" src="jquery-1.4.2.min.js"></script> <script type="text/javascript" src="jquery.qrcode.min.js"></script> <style> #output{ margin-left:300px; margin-top:100px; } </style> </head> <body> <div id="output"></div> <script> window.onload = function () { var trs = $('#output').qrcode({ width: 100, height: 100, render: "canvas", //设置渲染方式 table canvas text: utf16to8("javascript生成二维码"), background: "#ffffff", //背景颜色 foreground: "red" //前景颜色 }).find('tr'), trLen = Math.floor(trs.size() / 2), tdLen = Math.floor(trs.eq(0).find('td').size() / 2), tds, bgColor; var colors = [['#ff0000', '#0100e2'], ['#00ed01', '#9f4d95']]; trs.each(function (j) { tds = $(this).find('td'); tds.each(function (i) { bgColor = this.style.backgroundColor; if (bgColor == 'red') { this.style.backgroundColor = colors[j < trLen ? 0 : 1][i < tdLen ? 0 : 1]; } }); }); } 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; } </script> </body> </html>
jquery-qrcode ライブラリはエンコード変換に charCodeAt メソッドを使用し、このメソッドはデフォルトで Unicode エンコードを取得します。通常、デコーダは英語で UTF-8、ISO-8859-1 などを使用します。これは中国語であり、通常、Unicode は 2 桁の長さの UTF-16 で実装されていますが、UTF-8 エンコードは 3 桁であるため、QR コードのエンコードとデコードは一致しません。
解決策: QR コードをエンコードする前に文字列を UTF-8 に変換します。具体的なコードは次のとおりです: utf16to8 関数