TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
/ l4 h9 ^3 E3 R. B$ B4 U0 \& C% w. \ b* w; I: {
演示地址:http://www.52itstyle.top/qrcode/index.html% @( v+ i+ I2 {* i+ ^3 d- E, y
" h& p/ C9 S/ z1 d! m/ [6 x+ Y) Y4 p4 s
先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),' f* L4 i9 b8 Q' Y$ I& P) R
% x7 ^2 _0 n( o5 M( U$ D8 Dqrcode.js 是实现二维码数据计算的核心类,
6 O, ?' N5 { _$ u# Y& n- }; Z+ {% S2 k" F3 u# w2 `4 F
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。
' g2 y, g. Z5 P8 [, {1 H& @===============================================
8 n5 V! K3 j% pJS生成中文二维码问题:/ c! j! _$ u& _ R
其实上面的js有一个小小的缺点,就是默认不支持中文。
; x# G( U* ?( |7 C+ l
* @; f( }: d: f/ U4 A3 m! X这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,2 q" y" O% N6 c; O
" Y1 `$ z0 y3 `6 D
而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,
/ q; g/ W) v* v' Q0 k, b: {
& V+ Y. d s/ U' g5 _2 V英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。) G# ]: @/ Q) x! R7 d' ]+ A; G; }
+ _8 p8 z5 b" n8 f+ N! c; s# I1 b1 T解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:
5 z) L' L2 l }4 ]4 j; E& e找到插件中以下代码:6 R' j% C& O* @
- qrcode.stringToBytes = function(s) { F, Z6 _! ?# ]8 E' e5 ]
- var bytes = new Array();
5 Q* j7 z/ T2 } d- t - for (var i = 0; i < s.length; i += 1) {* W; e! ]) R; y7 n
- var c = s.charCodeAt(i);' h; F6 E/ @" _' c3 k# @
- bytes.push(c & 0xff);; f+ u- ?7 ]. d+ ]
- }/ h7 b) A/ y4 a. v" j$ T! J7 x
- return bytes;
复制代码 加入中文编码:- //中文转换
" y9 X/ A ~* k# r9 H - function utf16to8(str) {
: F0 w$ _# f( i. M& j - var out, i, len, c;
`% j( \7 B* R( T - out = ""; : V( L6 i0 N. s, p$ y
- len = str.length; . x) x9 k3 D; E+ l& X1 s
- for(i = 0; i < len; i++) {
- ]' F% z \ q, R0 d! G" f$ m8 [ - c = str.charCodeAt(i);
G2 o# K) ?3 y - if ((c >= 0x0001) && (c <= 0x007F)) { ) q, n( J2 @4 m/ Z) q7 T, F, G- Z
- out += str.charAt(i); 6 t4 \$ d: \, n) o
- } else if (c > 0x07FF) {
; l) y) u4 P0 V- Z! x8 R* P' z - out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); " V$ k: E0 N2 `7 y5 a- a4 u2 E S
- out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
7 B8 J, K- m8 _" }( B - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); 2 ?- A4 o. k3 Y
- } else {
& ]. g: w/ }# Q, k! f, l5 [& T - out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); 9 R" F! z1 O& W' ?. D
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
: s& ^9 h7 t" d V/ o: [' p2 u - } , B- v0 z; n6 U ^) n0 x1 R' U
- }
; x. ~: n) R7 }9 O: |- |" _ - return out;
1 y. \1 M8 U' d0 r0 l) ^/ p5 Q, t - }
复制代码 修改后:
7 J1 w# S! t, ~% S- qrcode.stringToBytes = function(s) {
# V; o9 m2 D+ ?! L3 Z - s=utf16to8(s);
6 J8 F6 [ T0 p# Q - var bytes = new Array();
, }3 B1 F/ C, @1 `2 e - for (var i = 0; i < s.length; i += 1) {
& w' x; _8 ~+ G( U - var c = s.charCodeAt(i);
# @- v/ c) D1 l3 A7 f8 h* A - bytes.push(c & 0xff);
( _5 h6 k; [& i - }4 `" h" _# G7 f4 \6 J' G: m3 \
- return bytes;1 X0 |( `9 X) M! Y* @2 w! @
- };
复制代码 中文乱码测试:
# P! H. u; T6 b" H; ~
( R6 b0 R; U/ f( f( F v
8 C m: P5 h$ w7 d# G( C) u# y# _4 b. n, p; ~ P9 ?0 r8 y3 ^
- I5 K$ }: m$ S
. A/ }- B0 x* @6 n/ h0 _
! s/ V4 `+ n* z/ Z演示样例:$ v- d5 g: i* u: ~- N
' K' \& E% l( G, I% M$ z
/ V: F9 o$ K9 p- V+ D- J; ]; O- w+ J4 N- f! B) I
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
" H! A; x- @" ?" Y9 _
0 X) Z& z h& U# a7 Z |
|