TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
2 h6 b3 c# K/ [% x! _1 ^' f' h
# w! R9 O. I" o* `9 h" [
演示地址:http://www.52itstyle.top/qrcode/index.html
3 v" f7 k. v/ S5 N# t1 o. l; k h. k. A: E0 Y: Z
5 V) o8 M8 B9 I2 p7 F
先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),
* c" ]) o4 I' _8 v9 E! M7 Q
! n5 _! b4 h0 e3 lqrcode.js 是实现二维码数据计算的核心类,
0 _: M7 T% b& E2 H/ P8 U# v k& [2 n; t8 P- B
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。1 q! h( x' J* N
===============================================) `, o9 O5 {8 w; K% R& W" f
JS生成中文二维码问题:
4 ^- O( H' U- s& L* n5 p0 q其实上面的js有一个小小的缺点,就是默认不支持中文。7 p8 I v( S0 l0 I7 i* j6 k
" p' m' W8 {5 e, X! C
这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,, a+ l1 E, D4 P9 q- P( K
; j( w1 ~) I& w5 U
而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,; r1 R3 T: ^4 J1 N
, `+ j7 W# F/ _) P# c" ~! e# I+ y
英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。
( y" w o p- f2 a
" p! c, p# M- ]0 N$ K S解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:
& k/ l/ n1 N8 c+ q找到插件中以下代码:
/ A" ]: c/ z9 s2 _' B8 Q! |9 n- qrcode.stringToBytes = function(s) {
6 b/ b% O# @) A2 p - var bytes = new Array(); z; a8 z6 }# b' i; E4 k. z3 n
- for (var i = 0; i < s.length; i += 1) {
6 K! Q5 j3 V. v, h- A& L6 ~8 @3 o7 h - var c = s.charCodeAt(i);8 D/ E1 g4 a1 j( z
- bytes.push(c & 0xff);& q0 j& U* V5 P2 y
- }
* N W2 D+ B6 S) l E j) R9 ? - return bytes;
复制代码 加入中文编码:- //中文转换2 k* i$ `! i" H' ^. [2 z) e1 `
- function utf16to8(str) { 6 Y+ K. l" K* p
- var out, i, len, c;
7 ^7 n' }8 N0 \( Y% }" P- _. R- i - out = ""; % @8 P( ]; \4 a7 ~3 ]- t
- len = str.length;
# q) r1 B' s1 e9 Q - for(i = 0; i < len; i++) { # _4 D1 U9 y ], r% P
- c = str.charCodeAt(i); & B1 C: v) u6 E6 M0 W1 ?
- if ((c >= 0x0001) && (c <= 0x007F)) { + c6 B( L6 x% r' E5 ^
- out += str.charAt(i);
8 }- [# A8 O3 s7 {9 j# \ - } else if (c > 0x07FF) {
0 U! O+ `5 g# _3 g6 J - out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
9 t9 G3 G/ [, B3 B. L - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); 9 ~9 W1 X: _; ?% z0 z
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
+ a$ M' o& @+ a - } else {
; s( `' a2 L& G! j1 N# q - out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); / g9 r* A" Q* U M4 _6 W$ l& ~' l( N
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
/ Q0 I7 W- u0 p - } ' [- L3 l& [3 ^6 c: k1 W
- }
# ?7 M$ d# u/ B& }1 O+ ^8 W - return out; , p, A0 E6 a2 \
- }
复制代码 修改后:5 q+ K* Y _6 M/ E: k' E3 W
- qrcode.stringToBytes = function(s) {5 [6 m% R# [# d( D/ D8 ^/ N- A" E
- s=utf16to8(s);/ m% D- t4 p0 s6 j+ V3 ?
- var bytes = new Array();
9 |, E u* |/ R' s - for (var i = 0; i < s.length; i += 1) {
0 l3 V5 j M* I1 J: k - var c = s.charCodeAt(i);/ S$ r: q' u9 ~6 b- w5 N6 Q- I8 D
- bytes.push(c & 0xff);* Q. B% b A0 e( I. l
- }9 w/ L7 r! q$ S& z/ i7 D. R
- return bytes;, J% T) g* }! y7 n! P3 F
- };
复制代码 中文乱码测试:2 c1 V1 @! R: N1 X% n
' N7 z7 l$ e% t( p. [4 m' B( Y$ D9 T, M; a! W
4 u k) J. |6 m
, F2 Z( L3 A. ~3 {* U& r( O2 \
' a f& i$ t8 x; G% U$ a; q7 F; Z" G; d+ H& P; a
演示样例:4 n6 n4 o0 ~ z7 [
" ]0 s, n$ V& D$ K5 H
& i" B& W* F1 E8 L9 y2 R9 H- v3 b$ n0 A% b ? w7 w: U$ ? t) U
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
, Z) @4 K, [0 ~# V
7 P6 l* @ y, k- S' q |
|