发布时间:2018-09-15作者:laosun阅读(10236)
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生成的二维码:
从上图中我们就可以看出两张二维码完全不一样,使用我查查扫描出来的结果截然不同
看结果:
大写的UTF-8扫描出来的结果会带有]Q2\000026字符。但不是必然出现的,几率还是挺大的。
所以这不算什么技术性问题,这就是坑,疑难杂症。
正确的写法:
// 设置编码方式 hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
版权属于: 技术客
原文地址: https://www.sunjs.com/article/detail/811b3f7e8070488d804a2ba4d152dc4c.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。