关于qrcode.js二维码插件不支持中文的解决方案

前言

最近在开发一个web项目的时候遇到了一个需要将短信链接转化为二维码的问题,于是我到网上去搜了一圈,发现了qrcode这款jQuery 二维码插件,于是按照qrcode的API文档使用了一下,发现如果是全英文的字符还可以正常运行,但如果出现中文就会出现中文乱码的问题(注:详细运行结果及代码如下);

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<script src="js/jQuery——2.js"></script>
		<script src="js/jquery.qrcode.min.js"></script>
		<title>优化qrcode.min.js中文乱码的解决方案</title>
	</head>
	<body>
		<div class="output"></div>
		<script>
			$(function() {
				$(".output").qrcode("优化qrcode.min.js中文乱码的解决方案");
		</script>
	</body>
</html>

关于qrcode.js二维码插件不支持中文的解决方案
随后我又在jQuery插件库中寻找了一大圈,最后在jQuery中关于qrcode插件的API文档中发现了一个解决方案;但发现还是有缺陷,因为他使用的是encodeURL进行转码,所以只能在网址中存在中文的情况下使用(注:详细运行结果及代码如下);还是不适合使用在发送短信和全中文字符的情况下使用。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<script src="js/jQuery——2.js"></script>
		<script src="js/jquery.qrcode.min.js"></script>
		<title>优化qrcode.min.js中文乱码的解决方案</title>
	</head>
	<body>
		<div class="output"></div>
		<script>
			$(function() {
				$(".output").qrcode(encodeURI("http://中文中文"));
			})
		</script>
	</body>
</html>

关于qrcode.js二维码插件不支持中文的解决方案
最后实在没办法,最后我将这款插件初略的看了一遍,发现原因在于:qrcode是采用charCodeAt()方式进行编码转换的,所以他会出现中文乱码的问题;而下面这种方法默认会获取它的Unicode编码,如果有中文内容,在生成二维码前就要把字符串转换成UTF-8,然后再生成二维码。

function toUtf8(str) {
	var out, i, len, c;
	out = "";
	len = str.length;
	for(i = 0; i < len; i++) {
		c = str.charCodeAt(i);
		if((c >= 0x0001) && (c <= 0x007F)) {
			out += str.charAt(i);
		} else if(c > 0x07FF) {
			out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
			out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
			out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
		} else {
			out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
			out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
		}
	}
	return out;
}

我相信这个方法我相信和多人在网上也有看到过,但在使用的时候都会先创建一个变量记录转化后的字符,可是你不觉得这样很麻烦吗?于是我又去仔细看了一遍qrcode插件的源码,最后经过我的更改,让这款原本不支持中文字符的插件能够支持繁简中文。

插件比较:

改版后的插件不再需要之前那样先创建一个变量记录中文转化后的Unicode编码;而是直接根据开发需求,按照qrcode官方的API编写就行,这样就极大的简化了程序员在开发过程的编写量和难维护的问题

旧版本插件使用方法
	//中文格式转换
    var str = toUtf8("优化qrcode.min.js中文乱码的解决方案");
    //生成二维码
    $(".output").qrcode({
        render: "table",
        width: width,
        height: height,
        text: str
    });
    
    function toUtf8(str) {
	var out, i, len, c;
	out = "";
	len = str.length;
	for(i = 0; i < len; i++) {
		c = str.charCodeAt(i);
		if((c >= 0x0001) && (c <= 0x007F)) {
			out += str.charAt(i);
		} else if(c > 0x07FF) {
			out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
			out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
			out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
		} else {
			out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
			out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
		}
	}
	return out;
}
新版本插件使用方法
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<script src="js/jQuery——2.js"></script>
		<script src="http://www.xiongdi.fun/js_downloads/cxj.qrcode.min.js"></script>
		<title>优化qrcode.min.js中文乱码的解决方案</title>
	</head>
	<body>
		<div class="output"></div>
		<script>
			$(function() {
 				$('.output').qrcode({
 					render: "canvas", //也可以替换为table
 					foreground: "#000",
 					background: "#f2f2f2",
 					text:"优化qrcode.min.js中文乱码的解决方案"
 				});
			})
		</script>

	</body>
</html>

关于qrcode.js二维码插件不支持中文的解决方案

结束语:

好了今天的分享就到这里了,希望今天分享的改版qrcode能够在日后的开发过程中帮助到你。如果有人还有更好的建议和改进方案可以随时AT我的,同样如果你觉得写的还不错,也希望你能给我一个赞或者关注我,我将尽我所能给大家带来更好的作品。记住:你的每一个想法都将有可能让你少奋斗10年或者更远;加油吧骚年!

下载地址:

百度云:cxj.qrcode.min.js 提取码:2a5o
远程引用路径:http://www.xiongdi.fun/js_downloads/cxj.qrcode.min.js