TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
4 W5 j+ J) v0 r' y5 l6 `+ ?
9 G& m/ ^) X8 C演示地址:http://www.52itstyle.top/qrcode/index.html4 |0 f8 y& F+ Y/ y/ K
& @' ^0 ]7 f" i4 O1 E7 D0 s
2 Y6 y, `" Q% W" I) F先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),, k! F3 L5 Y' ~& [0 h+ E3 B
% _% {8 V1 _7 k/ {+ v
qrcode.js 是实现二维码数据计算的核心类,! l. I- d0 m# n* c! d! B a
! M& O+ [. Y# i! c3 ?
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。
" W- ? }2 i5 ^' e- ]$ [9 W===============================================
, L0 c4 j m1 I! EJS生成中文二维码问题:
! D0 C, n: ~8 I! N0 l' Q8 w其实上面的js有一个小小的缺点,就是默认不支持中文。
( U0 Z+ Y) I/ }% q5 l9 c. H' f O `' F; c4 o
这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,. {2 A0 Q2 W. i. U
# d5 a5 D% V& D' j# }1 W/ J
而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,
: K/ q8 w- G# o( P
}- N, X, g' X1 h s/ R+ \英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。
7 q+ U, P# D0 i" u+ @. c7 I$ R# k4 x. V
解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:. C) N( r6 O$ k+ ^8 o. B
找到插件中以下代码:
1 d5 b+ l1 m# o4 \& l. Y- qrcode.stringToBytes = function(s) {
7 G& ?4 ~; K. s0 i: X8 ~$ B - var bytes = new Array();
S" |! h. u, n ?0 G- K/ ?8 Y - for (var i = 0; i < s.length; i += 1) {
5 Y- e9 v* g) p$ I; T - var c = s.charCodeAt(i);9 Y9 @( R; ^$ i
- bytes.push(c & 0xff);
+ q4 y8 |0 C! j0 Q \ - }
! h/ ?( } [) b. i, a6 g* U - return bytes;
复制代码 加入中文编码:- //中文转换
1 _( e3 V* k# \5 z$ T! v - function utf16to8(str) {
* H. @6 U; ~1 ^ - var out, i, len, c;
& o9 s: e3 Y1 F4 z% o - out = ""; 2 E% z6 c* p1 D$ d
- len = str.length;
0 |' o! c" p: l# G( A z, o - for(i = 0; i < len; i++) { # l3 C5 w/ @9 F0 M; B( o' }
- c = str.charCodeAt(i);
! C. T1 ]/ ~* q y d+ K$ S) n - if ((c >= 0x0001) && (c <= 0x007F)) {
9 C. S5 l6 T& x2 f3 n - out += str.charAt(i); : V/ Q, O& @+ _- [ A8 W2 p! i
- } else if (c > 0x07FF) {
0 P2 Z) |+ x* Z( S3 o& H3 ? - out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
; o* ~; u/ M. {3 S, p7 B$ H - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
, H9 w: U9 A l0 H* _ - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
9 P& g& S% N6 c9 ? - } else { 7 k& U4 O1 Y8 n% {3 N% [; `
- out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); 2 b& j) n9 J/ s: g* P* M
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
1 { a- x! T8 u2 y - }
4 E' K+ A- }$ a! ]# ] - }
* a4 k* H# v) f' v8 _ - return out; 3 u! v: m$ `. m
- }
复制代码 修改后:5 e* _5 }3 u. ^/ _% K2 x( H& K" p( G
- qrcode.stringToBytes = function(s) {$ E5 `% q$ `7 j2 j
- s=utf16to8(s);2 z# K x j' Y" w" L
- var bytes = new Array();
z0 [2 k* u. ?7 p% [5 O8 m( _ - for (var i = 0; i < s.length; i += 1) {+ A7 o: k8 \, d. V
- var c = s.charCodeAt(i);! u) v' ]9 o% s! j3 M
- bytes.push(c & 0xff);
7 v7 E4 P( K! y$ [/ L/ I. _! C - }
* {' q4 i) f4 r f; b/ n - return bytes;$ ~" O8 t/ [5 }" T: l
- };
复制代码 中文乱码测试: l% o3 c- s7 X4 g2 ]# r
! {" B4 Q. e. @2 l3 U, P4 o( }
* S5 a5 d9 Q. a
9 x7 O9 J: n: n. _2 p5 q
& `4 d$ _# V7 ?/ n [, o; l
) ]7 L7 C$ [# f8 E+ i7 M. E; @) y6 Y6 q! m
演示样例:
0 j6 S' b( [" L, n
; ]% s. }' t( H1 v4 J- G
6 D- b0 T5 c A& }% X' l
: n7 T* J6 o( p# u. S
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
/ L: M f1 p; S) P9 v: |6 ]5 ~
$ Y4 Z9 l, x$ V$ m+ y! I
|
|