TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
$ y6 `( N" ^. T
! K/ C3 _0 z" w% d- O演示地址:http://www.52itstyle.top/qrcode/index.html" B z7 \1 B A N0 K) Q4 Q
0 ?) u2 c9 T' _; H
* g7 w2 t1 K2 @6 X6 T5 W先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),: b& p: Y# @! F! A8 c8 x3 {
* B( }: t* R# |+ Xqrcode.js 是实现二维码数据计算的核心类,
+ [0 F* |: }* g% v& Z: N% a7 i( f& j) e/ ~5 f h! T
jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和image、table三种方式)。7 y: A; `5 j7 Y$ o p3 A. \
===============================================% X0 P$ W( K& Z8 d, f3 G5 U2 o
JS生成中文二维码问题:9 K; U I! ?# X/ l4 k; n; x
其实上面的js有一个小小的缺点,就是默认不支持中文。
$ [* ?3 [$ A) Y& `. B$ I2 Q i" u' N1 D' h( B
这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,/ r& w" L3 R4 A+ ?# A
0 g7 N$ a3 ]' W% t而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,
8 c' N; s( | f' @0 Z
& X |5 V. V% S" L# O' j英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。# \) |9 j- R0 {8 T
1 u- G0 S7 [4 F& u
解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:
: q l8 s2 \& s+ J2 X找到插件中以下代码:9 T, i$ A. o& x2 F
- qrcode.stringToBytes = function(s) {% V6 k$ b# u h
- var bytes = new Array();
3 k4 Q G7 j4 s) F - for (var i = 0; i < s.length; i += 1) {
! e9 A- X$ I5 i3 u3 }+ C - var c = s.charCodeAt(i); F ~+ B& h5 z' o
- bytes.push(c & 0xff);
% Q, o8 [- G5 Q, u - }
" w, f- S, E: F* k) |& t - return bytes;
复制代码 加入中文编码:- //中文转换
* D4 V6 h- @7 Q& |& h: I) z - function utf16to8(str) { 4 }& O; M2 S# r, u3 ^' ~" F8 L
- var out, i, len, c; $ c( U+ u( q) @' o2 H/ E+ w2 m
- out = "";
3 b0 e5 R2 f/ K V$ E - len = str.length;
6 F6 d$ S% ? ^1 n u& l& w - for(i = 0; i < len; i++) {
2 m; r: b' o2 t - c = str.charCodeAt(i); " H, A( ~, K7 [ N2 X, Q5 H4 v
- if ((c >= 0x0001) && (c <= 0x007F)) {
7 ~2 V( d" B3 _9 [; [+ d) ^ - out += str.charAt(i);
- l# y4 k1 b- ?+ s - } else if (c > 0x07FF) {
, T- h' t, _/ m4 d$ g3 f" V+ C2 [ - out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); 1 T4 b* h! J7 [; y L
- out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
; o! ?. n. X7 Q+ p - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); : G/ c! n1 i' {, j' n" l
- } else {
% y7 i) U& {3 n6 w) G7 i4 O( ^. |0 G/ e" J - out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
3 V! R* Z; K8 ^! a1 K - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); 4 O( F% J, x p7 g; a% [+ [
- }
5 [& ^) v4 g6 ^ - } . m$ p8 z1 t. W. y
- return out;
* X8 U5 a2 j; l+ W3 ^& B! R - }
复制代码 修改后:4 t8 H# Z6 M1 f) t y
- qrcode.stringToBytes = function(s) {
# D( h8 e' m% a | - s=utf16to8(s);
- w/ m0 K( n! j# t - var bytes = new Array();
2 p# I: l; \$ v; \ - for (var i = 0; i < s.length; i += 1) {
/ E7 K" O3 Z/ W1 V4 M% L3 C6 l/ T - var c = s.charCodeAt(i);
4 P& U3 x5 a' P( n1 q - bytes.push(c & 0xff);- y4 V6 |) l* V! u @
- }( N! f( ]8 J% a" C0 @" N& p
- return bytes;! z2 T" O, { O+ N# J
- };
复制代码 中文乱码测试:1 Q$ v5 O8 S: p: F, j+ H- Q
& R9 S: V3 R, h
6 r$ h6 y* J' C0 G9 y/ K
. C" {& ?' D9 E) q- M" K4 U3 X+ M$ c
7 H m) t/ E6 s: n+ g; h; T y3 V
0 W. s! M/ @; s2 h
" h) a! U! x, v( u+ H0 [演示样例:
: c0 j) s1 ~) s& M8 q- @ O$ ^
4 n, r, X( E) ^/ b6 B$ `1 x
; ]% D# D* v6 T- |4 S
6 g* D- v. B7 g2 u" @& l
百度网盘下载地址.zip
(225 Bytes, 下载次数: 4, 售价: 5 IT币)
3 q: x" S! y* p/ C. i
- h2 h) m" b* z; R5 _4 I |
|