TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
) M W5 ?* C: u I
; B5 K( y6 d5 R5 X. E+ C演示地址:http://www.52itstyle.top/qrcode/index.html
d# V$ Y, W! x' V, g" h
0 D8 U a& [- u4 n: T, e- |0 k5 o. q# a! E$ z' x
先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),( I2 q$ W; m- i5 X6 {
8 K o& t P( ]% ] R, F9 U
qrcode.js 是实现二维码数据计算的核心类,
+ E& r/ A z2 p" z" \7 x1 [. W' p( U; v7 t. M6 v
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。
8 s5 Y- z" J4 L& Y8 d===============================================9 }" y+ R x3 l$ f- @( r: c
JS生成中文二维码问题:
$ i5 ^7 K4 R4 s; Y其实上面的js有一个小小的缺点,就是默认不支持中文。
; Z* T' k: O5 y3 T6 y0 A7 ?; Y6 s2 n, H8 ^" z7 x
这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,
# P$ L) E& r: C( k# C
5 a% \& \0 `6 A/ n而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,( O7 }* p2 N/ c! E
: c5 O. M2 _% _; r8 S( `1 s/ ~7 D, ?
英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。
# H9 I n. Z8 T3 W* M( Y. k8 |0 M7 d$ q1 q9 E7 |* \
解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:0 ?6 W7 G- u& F0 N
找到插件中以下代码:- v9 f$ {$ z0 `: t
- qrcode.stringToBytes = function(s) {
1 [* i4 k* o: }8 R% ~" m. |6 j - var bytes = new Array();
9 ~% m- p, i+ h. J/ {" V - for (var i = 0; i < s.length; i += 1) {
: y% F9 Z, p! m& p6 n6 U - var c = s.charCodeAt(i);
4 A$ a! ` s1 w1 C - bytes.push(c & 0xff);! w/ l4 I# k8 M1 B
- }
" {6 ~0 b, p: w+ t - return bytes;
复制代码 加入中文编码:- //中文转换) t- j# B7 J$ o/ w& z6 o$ n) B7 Y
- function utf16to8(str) { ; D* {) S( X3 W) p, |0 E- ~6 B
- var out, i, len, c;
1 R W+ O% n0 B4 j& J; m2 S - out = "";
B( S, K z/ m: K - len = str.length;
- e1 j2 _! H) f# m1 I1 l. X - for(i = 0; i < len; i++) {
& m! s' ~+ l: N: l# x2 ]3 {; H - c = str.charCodeAt(i);
4 y9 K1 d5 |9 p l - if ((c >= 0x0001) && (c <= 0x007F)) { 0 j6 e% i9 Y* ?
- out += str.charAt(i);
$ u1 Z C; A3 W - } else if (c > 0x07FF) { 7 x0 u/ W' o9 I: E, P# O
- out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
+ j+ @3 A* s, o) U$ w, ^9 \ - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); , p* C" H1 D. o1 j& J
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
1 n `1 \/ W' I4 ~" E7 Q- T! G - } else { ( D) L+ ]" k+ U! O2 w2 c. H
- out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); * z& h* I0 M0 K, O
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); . g' \3 M% J: y. `1 X5 O
- } 0 z1 Z6 C: L: z( B- M
- } # l, I7 `9 ]& l) F6 ^0 v! h4 t
- return out; # K" a1 b O! S; H/ Y
- }
复制代码 修改后:9 n0 i8 m9 M6 s) A" V/ t
- qrcode.stringToBytes = function(s) {
0 ~- W2 D* b# v/ G& s( H" B8 Z - s=utf16to8(s);, s+ }3 T2 D% k9 H( t3 `6 Y2 E7 E( r
- var bytes = new Array();2 O2 ~. E4 y! i( V% i
- for (var i = 0; i < s.length; i += 1) {4 [3 q4 E. h. s) g+ _
- var c = s.charCodeAt(i);- Y! o, M# b5 q4 {
- bytes.push(c & 0xff);) o0 Y- o1 E8 J/ Q- M( ?$ F& u9 o0 u
- }# e9 Q/ `; N: o6 Z
- return bytes;/ e1 `8 X! b: ?. h
- };
复制代码 中文乱码测试:8 r- |0 f& N2 U" o9 @7 S- e {
: k- ^& I4 d1 O9 @
( d1 c. b I, J3 Y1 Y$ w6 f+ C: @
0 W! i" h+ V& y8 F7 P% Z
6 f, C4 P: b d B
$ Q, J4 w, c( m6 d$ Z7 }5 n# }% _; f" m3 r6 K6 e) f* [0 k4 p
演示样例:) w, a% _9 c7 o& Y) d
0 c5 _6 k- l. N- d3 _7 ~7 d9 t* H ^- a* w0 P+ _
' L L( p! f; g4 c
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
/ C' S7 b, `! v! _+ @
# P4 X& c; P2 \$ G4 G e! Q
|
|