TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
! O$ P% P' d$ J; Z& x( B- F
) |9 g& ?# x" g d" T演示地址:http://www.52itstyle.top/qrcode/index.html
6 y4 j2 V9 z( f3 ^9 F, t
" S1 `( Y- F1 O3 g1 Y0 ^7 \! U% `, p, y$ y' p8 J' }2 e
先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),
: k' {: C/ t* G% Z' r! Q: x C9 `1 D
qrcode.js 是实现二维码数据计算的核心类,
& E: t9 { h' B" R0 a: g' D/ m/ o$ A6 R N; d# c+ q
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。
# w9 H7 M1 o: P( B& c+ l1 N===============================================# l. V' H L3 B# }( A
JS生成中文二维码问题:) h9 ~" e2 D! H( _( g# c P
其实上面的js有一个小小的缺点,就是默认不支持中文。" v' H9 l4 i, A, b9 ~' Z( {
7 k+ u, q' M0 U* r }这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,- M$ C, V" G: w1 S" w) b2 o
# N) Q# {6 g1 w2 T- f5 M& }% I) h6 V
而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,! I; D6 i- I3 t6 q5 \6 a+ {
( s) {, ^3 L. _- [( h& }英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。
6 O, b: L5 g( M, z" j! X! J7 v( K/ j4 P3 ?3 l" b8 U; T! V
解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:
# n7 L" _0 B+ L8 r% {找到插件中以下代码:
) H# s( b% Y( R- V2 \& {$ f- qrcode.stringToBytes = function(s) {
% m/ f" m5 n p, o! ~% g" B - var bytes = new Array();6 T9 Y! b/ [( e6 n, d
- for (var i = 0; i < s.length; i += 1) {
4 r: n+ |, k2 L/ y: B - var c = s.charCodeAt(i);# s. v, B# _% A3 b, y' C& P: W' Z; L
- bytes.push(c & 0xff);
/ B5 s* ]8 v! f% V3 m( O2 C8 l - }0 N9 o' q0 \+ z; X6 `9 \
- return bytes;
复制代码 加入中文编码:- //中文转换) [$ E- }& J2 \6 c, t+ [. T, V
- function utf16to8(str) { $ |% J4 _- m$ l$ d5 \' u( h
- var out, i, len, c; ; l4 u2 w, i: l! ]+ i3 b& T
- out = "";
1 u8 t2 w1 u' t( n( P1 W - len = str.length; ; i2 K6 I# }5 S* f( J4 Y# ^4 K% s
- for(i = 0; i < len; i++) {
" o1 ~8 ~% w* j - c = str.charCodeAt(i); ' w: }! k2 f+ \$ J5 r) D) [( }
- if ((c >= 0x0001) && (c <= 0x007F)) {
6 K+ C3 \5 L8 |& [% }3 P* I9 p0 a$ d2 A - out += str.charAt(i); 6 H' ]% U+ x# H
- } else if (c > 0x07FF) {
0 f: }# c9 y3 G - out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
# ^: V! t! o' e6 a5 s: n: ? - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
: H1 e7 h/ d0 ~: c0 A o - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); ; H' r: S2 e0 O: d1 F9 ^: v
- } else {
4 E4 k: o/ L9 s: t# M - out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); " A2 v6 V, ]' H* y7 h; q8 l7 g
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
) x* V6 w# h/ _ - }
/ m$ g' \& w6 r* m. R - }
) C! F6 c" I8 e( ]: Y( u - return out;
% s4 W" ~/ a+ `, ~ H9 f6 p. h4 D1 k - }
复制代码 修改后:+ q: H. n, I. b. Y$ m1 N7 w
- qrcode.stringToBytes = function(s) {
4 g% H( G8 w6 r- P6 V8 f6 V/ p% L - s=utf16to8(s);
: s( O0 ~7 J& p+ L$ R& P7 R, x/ U% E# a+ g - var bytes = new Array();* Z0 d2 f; z* [6 v* s" m- S
- for (var i = 0; i < s.length; i += 1) {
- \) N2 q- t3 P0 h" \' ^' y& | - var c = s.charCodeAt(i);
8 r+ A+ w) T& ?. y* D- C - bytes.push(c & 0xff);
! G2 z: H6 b& S2 b4 V - }
' G& f. j9 ~! Y - return bytes;
7 c/ V% j8 g) W' k - };
复制代码 中文乱码测试:) E4 W# Y# q. q/ `& o: A
' p# ^& |$ ^0 K0 V8 ~
. ]; L" @9 f4 I: F6 `1 x
( q. z- }$ ~5 w
6 V% w9 D, z$ l7 L$ b8 y$ W3 `
6 i1 A ?% [ l0 l1 E# G3 e" t) _
7 E. p: s* t( ]3 l% v% _演示样例:
' i0 h, B$ I# f8 |- q a
% v# e4 e, @' h) X8 F3 @7 A% V. Q0 B0 i- r( A
3 V3 o* U1 ^) @2 J+ H
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
1 C1 B! ^" Y0 ^8 G& H3 c
* Z% O4 d2 L m; g+ Y7 g# O9 n |
|