TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
8 a6 J' I5 q# k2 g( B
5 ^5 {6 g" a+ I2 |
演示地址:http://www.52itstyle.top/qrcode/index.html2 l2 J' u8 H$ Q! N s- H: W
2 C4 j: }, t* s" P+ H8 i' t; [+ J* l" h" o' x7 q4 f0 @
先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),+ a; q/ w- `* U
8 i7 e; @7 `' b7 [) v1 \+ P4 vqrcode.js 是实现二维码数据计算的核心类,
5 W; R$ f# h* q8 H# S6 u |# L6 a9 g6 T3 ~5 @ C
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。
5 ~' X3 x7 m! l) [' I1 l% U; w===============================================
4 W* r. @& M( ]6 aJS生成中文二维码问题:
) P5 A% S$ s% z2 x" H其实上面的js有一个小小的缺点,就是默认不支持中文。+ K* B- r# D* R1 j
# n1 r/ B4 G' T+ L+ L这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,
+ f0 Q3 s* M- @- b# V' R4 R1 {4 K3 Z4 x. S
而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,) X: j& @! D. d7 W1 B) Q+ D' K: ?
; p8 u& S) R2 Z* a' F* q$ Q英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。
/ {( a& A* D/ q$ I! G% p2 _* ~" [- ~: a! |' r
解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:
7 e, C* x& b% u, D找到插件中以下代码:7 i$ C1 j4 ]( V/ n
- qrcode.stringToBytes = function(s) {
7 V4 O: k+ q& G* H9 s - var bytes = new Array();7 @6 F: k3 @) Z4 b O/ A
- for (var i = 0; i < s.length; i += 1) {
9 j% U8 u9 ?- ] - var c = s.charCodeAt(i);
8 u% s$ U5 W+ _7 k - bytes.push(c & 0xff);, T+ X1 e3 D6 S# k- ]7 n) Z
- }
( a7 `& @$ Q* J' D% L4 T: C$ k - return bytes;
复制代码 加入中文编码:- //中文转换
q! `# }) v( |2 R3 i - function utf16to8(str) { 1 T( C) U8 [' s: D; E! Z3 c
- var out, i, len, c; ; S- k- n2 S b& r: w% E
- out = "";
) @8 @# Z( T' @8 m; E, @ - len = str.length;
% T a$ B" [$ G- o1 {. n0 r" ^. [ - for(i = 0; i < len; i++) {
( k( e! s. j0 U# I. N6 C - c = str.charCodeAt(i);
4 q$ C3 m# J4 g# O# Q4 C6 |1 m! } - if ((c >= 0x0001) && (c <= 0x007F)) { 5 D# x+ [5 P# z9 v+ s. I
- out += str.charAt(i);
2 d* @, E* |5 p& T/ m - } else if (c > 0x07FF) { ! X4 L1 n( }" {! }' y- m% H
- out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); 6 M/ o' f" {" Q9 o: q! w
- out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); ; _7 z1 I8 O8 C
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); # V* n x+ @$ x" Z% @' `, `
- } else { # |9 m8 g# p+ B/ U3 P
- out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
* O/ r' E+ B) R/ w, o - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); 3 |' U; f! J0 P# J% U% [
- } 6 W3 W/ Y: ^# P6 j* j0 t, Q
- } - W) K! b: F, ^" H& B0 l
- return out;
" N: c4 Y* t) p2 o- P2 M) F0 U% B - }
复制代码 修改后:
! ]/ P1 L9 `" _: b: N1 c- qrcode.stringToBytes = function(s) {7 |2 S7 j& `; b3 K5 t- d
- s=utf16to8(s);
% j: ], r( S% F9 I8 Y& l# [6 e2 } - var bytes = new Array();
6 o0 H/ ]& a( D- K0 N7 X4 H+ h( z - for (var i = 0; i < s.length; i += 1) {' m+ u5 ?) B% w9 d* {6 s
- var c = s.charCodeAt(i);0 }% V% V/ t8 T
- bytes.push(c & 0xff);7 C# v+ g5 k+ E. W J8 x* U" e
- }! Z% k: i2 m3 V0 `8 A+ h* f4 |' _
- return bytes;0 }/ _3 k; G$ f6 J5 e' o
- };
复制代码 中文乱码测试:6 X3 R: w4 ]% i1 V& T
1 u: O0 k+ a* g; a! q) X% H0 i a9 R. I
; H( i* w4 j- @+ r
# h6 |# G# ^! n* L: A& E' ^
7 _. J% W3 L4 j7 `! [# `7 y# U7 i* k6 _ A4 [0 L1 l$ |
演示样例:; g, D3 q* k a8 t% y; v
' v/ M( n v5 X" ^' T4 M7 u% ]0 x$ u" t' ~3 F4 q
7 R, [& b/ A& b; g1 Y9 a2 A" U
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
" D' l c. J$ d$ {3 D$ ? m' u' W
. ?8 E- c" l- {! w |
|