iphone 上面一维码,二维码 zxing,zbar 最终乱码解决问题

iphone 上面一维码,二维码 zxing,zbar 最终乱码解决问题

这段时间在做iOS上二维码和一维码的识别
其间遇到问题无数, 特此总结下来, 希望能给后来的同学供参考
在iOS上, 做二维码识别, 首先在网上查找资料, 查找到ZBar和ZXing这两个开源的识别程序, 相比之下发现,
iOS上ZBar能做一维码(即条形码)和二维码的识别,
ZXing只能做二维码的识别, 但ZXing在android上是可以即做一维码又做二维码的识别, 但在iOS上尚不支持一维码的识识, 这是ZXing的官方说法, 具体以后支不支持尚不可知。
由于在我的这个项目中需要同时对一维码和二维码进行扫描, 所以果断地选择了ZBar, 然后开始了痛苦之旅。
首先在ZBar的官网上下到了其实例代码以及最新的.a库
http://zbar.sourceforge.net/iphone/
先对这几个实例代码进行编译, 真机测试, 效果还真不错。 然后在代码中引入进来, 效果也还不错。

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

(这个图是用 https://chart.googleapis.com/cha ... amp;cht=qr&chl=中&choe=utf-8生成的)
扫出来的结果是乱码, 而用ZXing扫出来,则是正常的“中”字
再接着扫下面这个图,
(这个图是用 https://chart.googleapis.com/cha ... amp;cht=qr&chl=中&choe=Shift_JIS生成的)其实除了utf-8和shift_JIS还有一种是ISO_8859-1,
见图

该图来自 https://chart.googleapis.com/cha ... amp;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
才对这个原因有了大致的了解, 再结合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直接使用就可以了



对于上面的三个图, 由于BOM(Byte Order Mark)的影响,使得ZBar在解析时, 出现乱码的情况, 现在这里用这UltraEdit来看一下这三个图,
UTF-8图: https://chart.googleapis.com/cha ... amp;cht=qr&chl=中&choe=utf-8


ISO_8859-1图 https://chart.googleapis.com/cha ... amp;cht=qr&chl=中&choe=ISO-8859-1


Shift_JIS图 https://chart.googleapis.com/cha ... amp;cht=qr&chl=中&choe=Shift_JIS


为了找到其中的区别, 我们需要用到工具UltraEdit工具, 在网上搜mac版 UltraEdit工具,然后下载下来进行安装.
安装完后, 用ultraEdit工具打开这三个图,
然后在这里面进行搜索, 根据同系列上一篇文章, 我们知道其中的BOM标记为 EF BB BF
于是在这三个数据中进行搜索, 我们发现只有在第一个图片,即UTF-8这个图片中才有这个EF BB BF标记, 而ISO-8859-1和Shift_JIS中都没有这个标记
如图:



进一步分析BOM, 请关注该系列下一篇文章


原文:
http://blog.csdn.net/smking/article/details/7310178
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值