Java zxing生成二维码,编码大小写问题导致内容中带有]Q2\000026字符

发布时间:2018-09-15作者:laosun阅读(10539)

Java

google的zxing生成二维码,编码大坑,就是在设置编码UTF-8时,最好是小写utf-8。否则会在内容开始部分增加]Q2\000026字符,这个真不是技术问题,而是疑难杂症!

    最近在搞二维码生成,使用的是google的zxing包。生成很简单,内容也都能识别。可是在众多终端扫码枪中,始终有那么一两个特殊,怎么都扫不出来(扫描后直接查询信息),身边没有扫码枪,生成出来的二维码必须交给终端设备使用者去测试,一来一回很耽误时间。

    看下生成代码:

    @Override
        public BufferedImage createQRCode(String content, ErrorCorrectionLevel level) throws WriterException, IOException {
            BufferedImage image = null;
            //二维码图片输出流
            OutputStream out = null;
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
            Map hints = new HashMap();
            // 设置编码方式
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            // 设置QR二维码的纠错级别(H为最高级别)具体级别信息
            hints.put(EncodeHintType.ERROR_CORRECTION, level);
            //hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
            BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400,hints);
            bitMatrix = updateBit(bitMatrix,10);
            image = MatrixToImageWriter.toBufferedImage(bitMatrix);
            return image;
        }
        /**  
         * 自定义白边边框宽度  
         *  
         * @param matrix  
         * @param margin  
         * @return  
         */  
        private static BitMatrix updateBit(final BitMatrix matrix, final int margin) {  
            int tempM = margin * 2;  
            //获取二维码图案的属性  
            int[] rec = matrix.getEnclosingRectangle();  
            int resWidth = rec[2] + tempM;  
            int resHeight = rec[3] + tempM;  
            // 按照自定义边框生成新的BitMatrix  
            BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);  
            resMatrix.clear();  
            //循环,将二维码图案绘制到新的bitMatrix中  
            for (int i = margin; i < resWidth - margin; i++) {  
                for (int j = margin; j < resHeight - margin; j++) {  
                    if (matrix.get(i - margin + rec[0], j - margin + rec[1])) {  
                        resMatrix.set(i, j);  
                    }  
                }  
            }  
            return resMatrix;  
        }

    博主之前一直认为二维码的生成,只要内容和容错率一样,生成的二维码就是一样的,其实不然。 导致二维码不一样的情况有很多种,下边就介绍一下常见的几种:

    1:内容不同肯定不一样

    2:容错率导致的不一样

        电平L(低) 7%的码字可以被恢复。

        M级(中) 的码字的15%可以被恢复。

        级Q(四分)[ 28 ] 的码字的25%可以被恢复。

        H级(高) 的码字的30%可以被恢复。

    3:图片大小也会导致二维码的不同,哪怕是相差1px

    4:编码方式大小写导致的不一致,坑爹的玩意

    具体实验可以到草料网测试一下。

    下边博主主要来讲一下编码方式大小写导致的不一致的问题。

    下边请手机下载我查查软件,扫码下边的两个二维码,微信等扫码工具扫码是没问题,偶然间发现的我查查这个软件。

    这个是大写UTF-8生成的二维码:

    这个是小写utf-8生成的二维码:

    从上图中我们就可以看出两张二维码完全不一样,使用我查查扫描出来的结果截然不同

    看结果:

    image.png

    image.png

    大写的UTF-8扫描出来的结果会带有]Q2\000026字符。但不是必然出现的,几率还是挺大的。

    所以这不算什么技术性问题,这就是坑,疑难杂症。

    正确的写法:

    // 设置编码方式
    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");


18 +1

版权声明

 Java  源码

 请文明留言

1 条评论