Zxing3.2.1 之前遇到过Android Zxing扫码乱码的问题,网上搜了下解决了下。 今天又遇到了问题。 依然会乱码。

研究总结如下:

Zxing 可以在Hints中添加默认编码格式。这个编码格式是用于解读Byte数据时,

1.如果码中没有指定编码集则,默认使用该编码格式。

2.如果制定了编码集,则使用编码指定的字符集。

并非强制,而中文的主要编码格式有两种,GBKUTF-8。

注意,网上有很多提到“ISO-8859-1”这个编码集的,这个编码集是个简单编码集,每个字节一个字符。并不是一个能表示中文的编码集。

有些情况可以利用他的单字节字符特性,进行字节和字符的互转。

但因为上面规则2的存在,使用这个编码集做byte取得的多多少少都有点问题。(如指明UTF-8编码的,则返回结果已经是utf8,用ISO8859取得bytes反儿会乱码,因为ISO无法表示UTF-8的字符,会替换为?号)。

因为,码生成不同,会包含是否指明编码格式两种情况,而编码本身又可能是Utf8或者GBK,而进行String转换的过程中,二进制信息会丢失。

因此思路上,如果可以取得原始的byte数组,就可以判断用正确的字符集显示了。应避免通过String转换取得。

解决也比较简单,看了下源码,发现其实扫码结果中本来就包含了这些信息。

  1. //源码 QRCodeReader   public final Result decode(BinaryBitmap image, Map<DecodeHintType,?> hints)方法中
    //向Result Metadata中放了一些额外信息。这是一个Map

  2. ……
  3. result.putMetadata(ResultMetadataType.BYTE_SEGMENTS,byteSegments);
  4. ……

这个result就是扫码结果result。 在实例中会在MipcaActivityCapture的扫码结果回调

  1. public void handleDecode(Result result, Bitmap barcode)

byteSegments记录了原始二进制数据,直接判断二进制数据格式即可。注意判空,例如如果同时支持扫描条形码,是没有Metadata信息的。

  1. List<byte[]> byteSegments = (List<byte[]>) result.getResultMetadata().get(ResultMetadataType.BYTE_SEGMENTS);
  2. StringBuffer buffer1 =new StringBuffer();
  3. for (int i = 0; i < byteSegments.size(); i++) {
  4. byte[] buffer =byteSegments.get(i);
  5. String tempStr = "";
  6. //猜一下编码格式
  7. if(isUtf8(buffer)){
  8. tempStr = new String(buffer, "utf-8");
  9. }else{
  10. tempStr = new String(buffer, "GBK");
  11. }
  12.  
  13. buffer1.append(tempStr);
  14. }
  15. resultString = buffer1.toString();

isUtf8 是网上抄来的一个工具函数,如下

  1. public static Boolean isUtf8(byte[] buffer) {
  2. boolean isUtf8 = true;
  3. int end = buffer.length;
  4. for (int i = 0; i < end; i++) {
  5. byte temp = buffer[i];
  6. if ((temp & 0x80) == 0) {// 0xxxxxxx
  7. continue;
  8. } else if ((temp & 0xC0) == 0xC0 && (temp & 0x20) == 0) {// 110xxxxx 10xxxxxx
  9. if (i + 1 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0) {
  10. i = i + 1;
  11. continue;
  12. }
  13. } else if ((temp & 0xE0) == 0xE0 && (temp & 0x10) == 0) {// 1110xxxx 10xxxxxx 10xxxxxx
  14. if (i + 2 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0
  15. && (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0) {
  16. i = i + 2;
  17. continue;
  18. }
  19. } else if ((temp & 0xF0) == 0xF0 && (temp & 0x08) == 0) {// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  20. if (i + 3 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0
  21. && (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0
  22. && (buffer[i + 3] & 0x80) == 0x80 && (buffer[i + 3] & 0x40) == 0) {
  23. i = i + 3;
  24. continue;
  25. }
  26. }
  27. isUtf8 = false;
  28. break;
  29. }
  30. return isUtf8;
  31. }

问题解决。

真·Android Zxing 扫码中文乱码解决的更多相关文章

  1. arcgis for android 读取shp文件中文乱码解决方法

    设置注册表默认字符,即可解决中文乱码问题. 'dbfDefault' 设置方法1.开始--运行,输入”Regedit“,打开注册表.2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ...

  2. Zxing中文乱码解决方法

    Zxing中文乱码解决方法总结 尝试过非常多方法  最后发现此方法解决的乱码最多....... 在百度搜索二维码图片 经过前2页的測试  除开一张图之外  其余都能扫描出结果 假设大家有更好的解决方法 ...

  3. zxing 扫码第三方SDK版本不兼容问题

    在AndroidStudio环境下,或许会遇到下面的问题: Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > ...

  4. java中文乱码解决之道(九)-----总结

    乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...

  5. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  6. php mysql 中文乱码解决方法

    本文章向码农们介绍php mysql 中文乱码解决方法,对码农们非常实用,需要的码农可以参考一下. 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行 解 ...

  7. java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**

    原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)—–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...

  8. Java 前台后台数据传递、中文乱码解决方法

    1.向前台传递数据;2.向后台传递数据;3.ajax post 提交数据到服务端时中文乱码解决方法;4.数组类型参数传递; 1.向前台传递数据:1.1 字符串数据传递:  这种方式只是单一的向前台传递 ...

  9. Git Status 中文乱码解决

    现象: jb@H39:~/doc$ git statusOn branch masterYour branch is up-to-date with 'origin/master'. Untracke ...

  10. python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色)

    python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色) 前言 在 python 开发中,有时候想通过cmd窗口来和用户交互,比如显示信息之类的,会比自己创建 GUI 来的方便,但是随之而 ...

随机推荐

  1. 开心档之CSS 测验

    ​ 目录 CSS 测验 ​编辑 CSS 测验 CSS测验是一种衡量前端开发人员对CSS的熟练程度的测试.通过CSS测验,可以评估一个人对CSS语言的掌握程度和应用能力,帮助公司或招聘方挑选合适的人才. ...

  2. PPT 插件

    https://www.aboutppt.com/ 小顽简报 https://www.yuque.com/wonvy/pptools/veu9yq https://pan.baidu.com/s/10 ...

  3. k8s-修改线程数

    1.背景: (1)胖容器ssh登录报错:handshake error (2)登录宿主机后,观察pod状态为running,但是kubectl exec 和docker exec 均无法进入该容器,报 ...

  4. CodeForces -337A:Puzzles(水)

    The end of the school year is near and Ms. Manana, the teacher, will soon have to say goodbye to a y ...

  5. 什么是离散化?C++实现方法

    简介 离散化本质上可以看成是一种 哈希 ,其保证数据在哈希以后仍然保持原来的全/偏序关系. 通俗地讲,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法.离散化本质上是一种哈希 ...

  6. Spring Boot 自动配置注解源码解析

    前言 为什么Spring Boot这么火?因为便捷,开箱即用,但是你思考过为什么会这么便捷吗?传统的SSM架构配置文件至少要写半天,而使用Spring Boot之后只需要引入一个starter之后就能 ...

  7. CPLEX通过Python API获取Gap值的方法

    写在前面 最近在使用Cplex求解模型,尽管Cplex的Python API会自动输出引擎日志,但在多次求解中一次次看引擎日志找Gap值并做实验记录很麻烦,所以需要找到获取Gap值的方法.然而我在Cp ...

  8. secure boot (一)fit image

    前言 secure boot 和FIT Image是前段时间接触到的,其实早就该总结下了,奈何懒癌犯了,拖了好久才写出来. 之前也有人问我,工作后最大的感受是什么?我的回答是:"快速学习&q ...

  9. VueTreeselect

    https://www.vue-treeselect.cn/ 官网简介

  10. fetch概述

    1.基本特性 更加简单的数据获取方式,功能更强大.更灵活,可以看做是xhr的升级版 基于promise实现 2.语法结构 3.fetch的基本用法