zoukankan      html  css  js  c++  java
  • 通过jquery-qrcode在线生成二维码

    随着移动互联网的发展,二维码现在应用得越来越广泛了,随手扫扫就可以浏览网站、加个好友什么的,比起手工输入真的是方便太多了。

    前期做了一个综合测评系统,考虑逐步实现移动化,一长串的IP地址用户输入也不方便,借助二维码的话,用户拿起手机扫扫就可以直接进入系统。

    基于这个应用场景,就上网研究下了网站二维码的实现方式,归纳起来有以下两种:

    1、借助一些二维码生成网站或者二维码生成器生成二维码图片,然后挂在网站上,如码云 QR-Code (二维码) 在线生成器

    优点:开发成本为零,能够快速实现多样化的二维码;

    缺点:变更二维码的维护略显麻烦

    2、在后端利用java或.net代码生成二维码图片,再在网站上引用图片,如qrcode、zxing等

    优点:可定制性强,可快速批量生成

    缺点:重量级实现方式,对于简单应用来讲开发成本较高

    3、在前端页面通过javascript等方式即时生成为二维码(ˇ?ˇ) ,如jquery-qrcode

    优点:轻量级实现方式,减少图片IO,节省流量

    缺点:不适合复杂二维码的生成

    当然在实际应用中,这三种实现方式也不是完全孤立的,我们也可以根据项目实际情况结合应用,最大限度地提高效率、节约成本。

    晚上时间也不多就选了个jquery-qrcode研究下。

    jquery-qrcode

    jquery-qrcode是一个能够在浏览器端生成二维码的jquery插件。它是独立的,最小压缩之后不足4k,也没有图片下载请求。引入该类库之后,只需要一行代码,就可以很容易在web页面加上二维码。

    其托管在github上:https://github.com/jeromeetienne/jquery-qrcode

    jquery-qrcode主要包含两个文件:

    1、qrcode.js:二维码算法实现类

    2、jquery.qrcode.js:用jquery将qrcode.js封装起来,根据用户参数,实现canvas及table两种方式渲染生成二维码

    压缩之后的只有一个文件jquery.qrcode.min.js。

    代码实现

    github上其实已经有了非常详细的使用说明及示例,在此就不多做说明了。

    不过为了方便今后使用,我还是结合网络上大家的使用心得重新整理一份代码。

    jquery-qrcode.html代码如下:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>通过jquery-qrcode生成二维码</title>
    </head>
    <body>
    <!-- 引入百度CDN公共库的压缩版jQuery -->
    <script src="http://libs.baidu.com/jquery/2.0.3/jquery.min.js"></script>
    <!--引入压缩版jquery.qrcode.js -->
    <script src="jquery.qrcode.min.js"></script>
    <!--未压缩则需要引入两个文件jquery.qrcode.js和qrcode.js -->
    <!--jquery.qrcode.js:jquery封装渲染类库 -->
    <!--<script src="jquery.qrcode.js"></script>-->
    <!--qrcode.js:二维码核心计算类库 -->
    <!--<script src="qrcode.js"></script>-->
    <script src="jquery.qrcode.min.js"></script>
    <!--解决中文乱码问题,引入utf16t8.js -->
    <script src="utf16to8.js"></script>
    <p>用canvas渲染(http://www.cnblogs.com/scaleworld/)</p>
    
    <div id="qrcodeCanvas"></div>
    <p>用table渲染(量衡天下博客:http://www.cnblogs.com/scaleworld/)</p>
    
    <div id="qrcodeTable"></div>
    <script>
        //最简用法,render默认是canvas
        $('#qrcodeCanvas').qrcode("http://www.cnblogs.com/scaleworld/");
        //完整用法,有默认值的均可省略
        $('#qrcodeTable').qrcode({
            text: utf16to8("量衡天下博客:http://www.cnblogs.com/scaleworld/"),//二维码包含的内容,默认只支持英文内容,中文会乱码,通过utf16to8转码可支持中文
            render: "table",//渲染方式可选择canvas或table,默认是canvas,canvas方式还支持右键图片下载
             256,//宽度,默认是256
            height: 256,//高度,默认是256,建议宽度和高度保持一致,否则不容易被识别
            typeNumber: -1,//计算模式,默认是-1
            //correctLevel: QRErrorCorrectLevel.H,//纠错等级,默认是QRErrorCorrectLevel.H,但是加上correctLevel这一行后无法渲染出二维码
            background: "#ffffff",//背景颜色,默认是白色
            foreground: "#000000"//前景颜色,默认是黑色
        });
    </script>
    <body>
    </html>

    utf16to8.js

    基于官方示例测试,我们会发现识别出来的中文二维码会是乱码。

    根据园友心存善念的解释:

    这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,

    而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,

    英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。

    解决方式当然是,在二维码编码前把字符串转换成UTF-8

    因此我们可以借助utf16to8.js解决这个问题,具体代码如下:

    function utf16to8(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;
    }

    大家也可以上我的github下载这些代码。

    应用效果

  • 相关阅读:
    JDK11 | 第七篇 : ZGC 垃圾收集器
    JDK11 | 第六篇 : Epsilon 垃圾收集器
    JDK11 | 第五篇 : 启动单个Java源代码文件的程序
    JDK11 | 第四篇 : 增强API
    JDK11 | 第三篇 : 局部变量类型推断
    JDK11 | 第二篇 : JShell 工具
    JDK11 | 第一篇 : JDK11 介绍
    客户端负载均衡Ribbon之源码解析
    DockerSwarm 微服务部署
    DockerSwarm 集群环境搭建
  • 原文地址:https://www.cnblogs.com/imfanqi/p/4456879.html
Copyright © 2011-2022 走看看