TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
, b* _/ a" q- {% Y; _4 g- S- ]
. A* C, g3 k: m: r( [4 \演示地址:http://www.52itstyle.top/qrcode/index.html
- p# ^: I1 ?2 k+ ]( V4 Q) Z7 A" R1 E- `* m9 s. }4 j7 g1 D
+ S+ i( K4 K( I, r( t/ u先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),. [+ a3 E1 h# ?0 L# t' Q+ c/ P
4 D# w# D, M& `9 j: sqrcode.js 是实现二维码数据计算的核心类,
- ^; C1 ~- r' X
1 Y" ?6 o2 r' t5 k2 G# A- }jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。; t& U1 D. ~. z9 U7 o B% y1 Y) F
===============================================9 Z1 c( m; G8 G+ \
JS生成中文二维码问题:; q$ w/ H7 V$ e( V* m1 F! H
其实上面的js有一个小小的缺点,就是默认不支持中文。2 y. |2 q9 D2 B$ \) Q) e
" @( u7 x) @, R/ x( [. S. B5 _8 `
这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,6 ]# u+ U4 M/ O, p3 p" Q3 c1 L
& K4 u4 }' r' Z3 I$ i' J* z2 D+ S而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,* C: Q1 q; W- \- u L( V" X" R
& N# R7 T) {0 n英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。
' V# @. S; E, y1 o7 A$ Z
/ p% o7 f# o* q: m解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:+ `( ]0 ]* N3 n. T# r$ s5 t
找到插件中以下代码:0 B6 c6 u: q' k% P' b" X
- qrcode.stringToBytes = function(s) {
. H* p' [6 d. g4 {4 q9 \- \( J. U; X - var bytes = new Array();& h6 Z' T( S- z3 m' E8 ?: P
- for (var i = 0; i < s.length; i += 1) {
6 J: d' l3 L8 f! B/ O5 q6 ] - var c = s.charCodeAt(i);
6 x: O% [4 ]' ^! g7 i - bytes.push(c & 0xff);/ S) I) C9 {& J6 I! D
- }3 E% Y3 [) T; d" V3 A" p$ W/ I
- return bytes;
复制代码 加入中文编码:- //中文转换
) i, x+ N+ o! f: a - function utf16to8(str) {
. |$ n2 p7 H& D7 Q - var out, i, len, c; 1 @1 d/ W" @& _7 p ~2 P9 b
- out = ""; 9 {0 L: [7 k& ^/ E [
- len = str.length;
! U8 ~: \; r( L - for(i = 0; i < len; i++) {
8 i& d& Z" s- [' b0 Z - c = str.charCodeAt(i);
0 O( e& ^+ x1 f; Z - if ((c >= 0x0001) && (c <= 0x007F)) { 3 e2 v1 B0 x1 S; W
- out += str.charAt(i);
/ k$ ~$ F7 E0 E) e+ x. M# x - } else if (c > 0x07FF) {
) c. ~8 C! Q" \& T, K: v9 q - out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
2 a1 k1 I- X' t8 l) ?, ~ - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); ; [: l2 U5 p }# i
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
* W/ f! `5 f" d/ E- V" l2 E# f - } else {
* B, m/ {2 B! s3 k - out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); 4 O1 H/ B* b- P. @9 N
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
6 n' s) g. C$ U" } - } 7 {( V. p+ @+ u5 t/ C
- }
3 p4 V/ H3 e( F' I9 a9 W* { - return out; 0 V o; f/ C5 a6 h1 L* i
- }
复制代码 修改后:& M; X! r! m) s% s
- qrcode.stringToBytes = function(s) {$ z" n1 a& F; e
- s=utf16to8(s);
$ R) E% W6 W% x* Q Y6 j+ b - var bytes = new Array();
% d4 r! t5 a$ r" D4 F5 ]7 s! U - for (var i = 0; i < s.length; i += 1) {
& z& |, w1 p9 W" ~ e$ _: I - var c = s.charCodeAt(i);
1 K9 Z" D9 I9 ^" T* |1 f% m- R - bytes.push(c & 0xff);
7 p& Z4 ]2 Y& A( ] j - }
% [! ~- e3 G; {! c/ `; w - return bytes;* C/ k2 G1 G0 J& v
- };
复制代码 中文乱码测试:
3 [3 G: \5 Q, ^1 \9 K0 a' v
' v" \" t$ o' U/ x* j6 O
) ^9 D* D0 I0 r& C1 M1 y6 X M k1 f9 Y0 ]# Q+ g6 U
' {( V6 b4 X$ j# e/ @4 y/ L4 X; V
5 {! Q( A5 ^2 @9 d q: c6 e
9 i9 }, I9 u& ?9 i5 S) N! N' l9 [演示样例:* U" k5 c& j0 R
- W: A: H4 ]( c2 R
0 N$ _, T) L4 U' L! y" D( E9 t
: B: w9 T. @$ l$ F
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
3 j( ]; n, G2 l+ L$ f; ?
8 F% J; `- X/ }9 ~ |
|