TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
0 I) W( ^2 @3 J) P3 z$ E. d X# h; Y* e! D& l0 a
演示地址:http://www.52itstyle.top/qrcode/index.html
" t8 A4 R( f( o" ^+ s# J, L% _$ ]! @" K
& R/ U1 H+ A% g! _% Y% r4 c先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),
5 F1 O) b* K- R: u3 a2 M t
u. k) T7 P1 x8 Iqrcode.js 是实现二维码数据计算的核心类,
1 g" y1 p/ E4 F0 D! [$ l( h$ j1 ~) Y
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。
) J4 e! V1 x1 M===============================================
: k1 \+ x8 w$ bJS生成中文二维码问题:
, f/ |7 J+ Q) E0 W' a其实上面的js有一个小小的缺点,就是默认不支持中文。
. H6 R* `0 b5 f2 v% I
! }$ {. ^5 \6 E7 C这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,
# A) b/ _& S2 F+ [
6 K6 b! ]+ L, o% F' O2 r8 Q; a) F: P而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,* E6 n+ |7 Y0 A9 F3 \6 ?- I% _
3 c8 C8 L9 O' n! D% z% t/ ?& p
英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。5 O* ]- m, Y1 N
) J- ~4 ?7 P; g2 {/ B' k
解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:
) L% e* g6 P2 d# `! Z5 q5 o找到插件中以下代码:
0 e4 H# E5 ~# D* R' _3 N- qrcode.stringToBytes = function(s) {
# u) Z' m. F3 W' u) o9 O* A" k7 X' a - var bytes = new Array();
+ K7 a' o% p3 v5 l7 w - for (var i = 0; i < s.length; i += 1) {
( t4 A: i$ L; U! e3 |/ l( m - var c = s.charCodeAt(i);4 W. \6 S" O( \( D/ f1 n" c
- bytes.push(c & 0xff);# O. ~" X7 C& S# r
- }
" A, Z0 H3 D; b+ T) P - return bytes;
复制代码 加入中文编码:- //中文转换
1 u# R: @2 \( R. h2 m- [ - function utf16to8(str) { / s$ B" C" y( z+ G
- var out, i, len, c; 2 u$ Y# U+ C; C0 `1 Y
- out = ""; 1 Q! N* q5 g2 f7 r, k1 B: s1 {' H
- len = str.length;
, ?* w, b1 ]7 K$ S; D9 e, }% u - for(i = 0; i < len; i++) {
$ i$ Z" s D+ \/ s% q - c = str.charCodeAt(i); u- e9 ~4 ~) @/ n/ h: Z+ D
- if ((c >= 0x0001) && (c <= 0x007F)) {
& ^! |' T1 _' E2 i) g - out += str.charAt(i);
; g+ c( W) Q0 j5 T# G. a2 q - } else if (c > 0x07FF) {
1 [( G3 z+ ~' T$ B. K) X3 }/ p! _ - out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
, ~9 O% F6 |3 k2 q - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); 3 O% P# W8 i$ \ y9 Y( h; y
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
! x2 z+ P H5 h: e - } else { 1 B7 q7 G5 i9 e8 p! @' J8 Q0 e
- out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
: W* Z' R! w9 V - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); " d! G5 s4 Q6 f# K2 L" g. b8 M
- } 2 b0 `) `+ X0 ~$ h3 m2 j: K
- }
' L* z& G* r d2 F- J9 F+ y* F' @! B - return out;
/ D$ b4 ?3 w8 A; A& U& R - }
复制代码 修改后:
" h/ _% v' J. Y- qrcode.stringToBytes = function(s) {
0 R2 }, z8 U$ C& u! K# U - s=utf16to8(s);
0 N& i1 s4 H h - var bytes = new Array();" c6 [& }/ x8 S9 l& s: n! G
- for (var i = 0; i < s.length; i += 1) {
0 U$ @5 t# M# u9 H4 ]( x - var c = s.charCodeAt(i);( V' `0 s+ d4 K+ X
- bytes.push(c & 0xff);: c% {1 t/ O4 s& E
- }
9 ^6 _. w. m. D1 N9 @ - return bytes;
5 n0 f0 m& I6 | M) Q$ C, R - };
复制代码 中文乱码测试:
0 \* N6 h1 Q0 T& `
+ X N @9 g- ?# H. C* Y* U4 `/ ^, w6 e8 g- P
- E4 t1 y9 c9 N
2 C, t; c) o8 ]0 F& Z* s
/ M6 g# h( @/ v8 V
' j4 k% B) N8 N% f Q- ]
演示样例:" d$ o2 ?8 Y+ X# M7 }2 F J
5 r6 B% o. z5 g. s$ f( v. m1 S. E% e% s, m* [
: \; ~6 ~5 e' C- U7 X
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
$ L9 v T- V" j! I( W2 ~# j
( ~1 U, c {) P+ x4 [ |
|