这段时间在做iOS上二维码和一维码的识别

其间遇到问题无数, 特此总结下来, 希望能给后来的同学供参考

在iOS上, 做二维码识别, 首先在网上查找资料, 查找到ZBar和ZXing这两个开源的识别程序, 相比之下发现,

iOS上ZBar能做一维码(即条形码)和二维码的识别,

ZXing只能做二维码的识别, 但ZXing在android上是可以即做一维码又做二维码的识别, 但在iOS上尚不支持一维码的识识, 这是ZXing的官方说法, 具体以后支不支持尚不可知。

由于在我的这个项目中需要同时对一维码和二维码进行扫描, 所以果断地选择了ZBar, 然后开始了痛苦之旅。

首先在ZBar的官网上下到了其实例代码以及最新的.a库

http://zbar.sourceforge.net/iphone/

先对这几个实例代码进行编译, 真机测试, 效果还真不错。 然后在代码中引入进来, 效果也还不错。

但是当在扫如下二维码时, 就出现乱码问题了。

(这个图是用https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=中&choe=utf-8生成的)

扫出来的结果是乱码, 而用ZXing扫出来,则是正常的“中”字

再接着扫下面这个图,

(这个图是用https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=中&choe=Shift_JIS生成的)其实除了utf-8和shift_JIS还有一种是ISO_8859-1,

见图

该图来自https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=中&choe=ISO-8859-1,但这种暂不在该文章讨论之列。

扫这个图扫出来是“中”字,而用ZXing扫出来却是乱码 (之前有人要求我用ZXing, 我知道ZXing同样有缺陷,但却一时没有找到合适的例子, 下次再有人问的话, 就拿上面的图回他吧)

如何解决这个问题呢?

后来不断地在ZBar的官方论坛上发言,论坛地址: http://sourceforge.net/projects/zbar/forums/forum/664596(这里是这个论坛的help分支, 还有developer和app分支, 建议到这几个地方都去问问题, 能更容易得到更多人的关注)

问这个情况, 然而该论坛的版主似乎并不太关心使用者问的问题, 我是一连在这外论坛里就这件事事情追踪了7天, 连续发问,才终于有人回我了,然后有个印度人回我, (之前我对印度佬不是很有好感,但这件事过后, 我改变了看法)说可能是因为BOM(ByteOrder Mark)的原因, 然后给出了上面两个图的地址, 我通过删除这些地址找到

http://code.google.com/intl/zh-CN/apis/chart/infographics/docs/overview.html

以及http://code.google.com/intl/zh-CN/apis/chart/infographics/docs/qr_codes.html

才对这个原因有了大致的了解, 再结合ZBar论坛上的回复, 知道了应该是由于ZBar在扫描时,不知道这些图中使用的是UTF-8还是Shitf-JIS生成的, 所以会进行自动判断, 有时能判断对, 有时就会判断错, 判断出错的情况也就是我们看到的乱码。

这也能解释, 对于乱码的时候, 如果输入的是“中国”, 或者“国”字, 却不会出现乱码, 当时这个问题也纠缠了好长时间。

所以解决办法有两个, 一个是从源头上解决, 即要求生成的二维码需要按Shift_JIS方式生成, 而ZBar就不需要改动, 直接使用即可。

另一个方法是, 生成的码不变, (这种情况居多, 因为你不能要求客户非要按你这种格式来生成, 通常客户会用较常用的UTF-8来生成),改动ZBar的源码来进行处理, 强制地告诉ZBar,让其使用UTF-8进行解二维码。

另外这个问题也可以参考一下http://code.google.com/p/zxing/issues/detail?id=103(下面的回复看起来似乎比较权威, 感觉像是那么回事。)

所以下面将进行ZBar源码的修改

首先从http://zbar.sourceforge.net/download.html下载最新的源码, 我下载时最新的为0.10

然后我在代码zbar/qrcode/qrdectxt.c中发现了BOM, 读了一下这个.c文件, 基本思想应该是在里面同时用了

/*This is the encoding the standard says is thedefault.*/

latin1_cd=iconv_open("UTF-8","ISO8859-1");

/*But this one is often used, as well.*/

sjis_cd=iconv_open("UTF-8","SJIS");

/*This is a trivial conversion just to check validitywithout extra code.*/

utf8_cd=iconv_open("UTF-8","UTF-8");

接着

enc_list[0]=sjis_cd;

enc_list[1]=latin1_cd;

enc_list[2]=utf8_cd;

然后下面接着对这三种情况都执行解码, 最后选出一种zbar觉得合适的返回给调用者, 如果zbar选择错了,那么就出现了不想看到的乱码, 所以在这里只需要干涉一下这个选择顺序即可。

最后再进行terminal编译生成一个新的libzbar.a直接使用就可以了 (另一篇文章将会讲到如何如何在terminal中进行编译)

iOS上二维码和一维码识别系列一相关推荐

  1. iOS上二维码和一维码识别系列二

    对于上面的三个图, 由于BOM(Byte Order Mark)的影响,使得ZBar在解析时, 出现乱码的情况, 现在这里用这UltraEdit来看一下这三个图, UTF-8图: https://ch ...

  2. iOS 花式二维码生成和二维码识别

    iOS 原生的二维码识别非常之棒,反正比 ZXing 和 ZBar 效果都好些,所以以后打算尽量用原生的二维码识别,然后最近把原生的二维码生成也顺便做了一遍,并且在原有基础上加了一些样式参数,封了一个 ...

  3. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  4. iOS 生成二维码/条形码

    级别:★★☆☆☆ 标签:「iOS CIFilter」「CIQRCodeGenerator」「CICode128BarcodeGenerator」「二维码加logo」 作者: Xs·H 审校: QiSh ...

  5. iOS原生二维码扫描(一)

    首先搭建一个最初步的能识别出二维码信息的最基本框架: @interface ScanCodeViewController ()<AVCaptureMetadataOutputObjectsDel ...

  6. ios微信二维码无法长按识别的若干解决方案

    ios微信二维码无法长按识别的若干解决方案 参考文章: (1)ios微信二维码无法长按识别的若干解决方案 (2)https://www.cnblogs.com/is17/p/5777373.html ...

  7. iOS开发—二维码扫描-郭宏志-专题视频课程

    iOS开发-二维码扫描-3869人已学习 课程介绍         本课程由扣丁学堂教学总监郭宏志老师讲授,主要讲解了iOS开发专题中的二维码扫描这一专题,内容包含了二维码扫描中的全部知识,让学员更多 ...

  8. iOS 原生二维码扫描和生成

    代码地址如下: http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描 ...

  9. 使用zxing包生成和扫描二维码和一维码

    在开发之前要先下载zxing包对其简化,新建一个android工程,把zxing包中的android和android-code中的文件复制到相应的文件夹里面 其中的libs文件夹里需要zxing包中的 ...

最新文章

  1. 12C expdp issue
  2. Windows server2008服务器设置多用户登录
  3. 新视频超分算法来了:CVPR 2021 NTIRE 2021 冠军
  4. 自动驾驶高峰激辩:寒冬还有多远,芯片路线之争,人才缺乏待解
  5. Linux内核网络数据发送(六)——网络设备驱动
  6. linux入门教程(二)
  7. java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂
  8. 2018-2019-2-20175225 实验四《Android开发基础》实验报告
  9. Linux Vim显示行号方法详解
  10. 用vue和node写的简易购物车
  11. 联想小新/YOGA新品发布会官宣:定档10月20日
  12. VB在菜单上增加图标
  13. perl 教程网站 记录
  14. java毕设项目开源了,springboot+vue的应用级erp系统
  15. 【路径规划】基于蚁群求解多旅行商MTSP问题matlab源码
  16. 如何沟通?如何商务谈判!《沃顿商学院最实用的谈判课》epub免费下载
  17. 认识网络号与子网划分
  18. boost:lexical_cast
  19. 直播能为教育机构做些什么?授课和招生是必备的
  20. 基于Arduino IDE开发的ESP8266(ESP-12F)项目4 ——中断及高级输入输出

热门文章

  1. k-means(k均值聚类)算法介绍及实现(c++)
  2. 移动端长按文本选择复制
  3. MySQL的进程状态
  4. 谷粒商城十elasticsearch搜索服务及商品上架
  5. Fisco技术文档总结1---搭建第一个区块链网络
  6. websocket 技术文档
  7. java后台实现支付宝支付接口、支付宝订单查询接口 前端为APP
  8. VsCode 使用less
  9. 伊利收购澳优、蒙牛私有化雅士利,乳业双雄能在“奶粉界称王”吗?
  10. MATLAB常用指令及解释(持续更新中)