首先声明,我也是网上看到这解决方法
1、 具体的原理就是Zbar在扫描选取编码过程中选取编码不匹配造成乱码,而Zbar里面有3中编码,SJIS、ISO8859-1、UTF-8,在扫描选取的时候我们字需要更改其选取解码顺序
所以下面将进行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中进行编译)
转载:http://blog.csdn.net/longlongago2000/article/details/7594735
2、解决ZBar 乱码不需要静态库
在自己的应用中调用下面的代码处理下获取的string即可
// 识别扫描后的信息类型
NSString *symbolStr = symbol.data;
// zbar是日本人开发的,需要将默认的日文编码改为UTF8,否则扫描“坑爹”和“尼玛啊”等会出现乱码
if ([symbolStr canBeConvertedToEncoding:NSShiftJISStringEncoding])
{
symbolStr = [NSString stringWithCString:[symbolStr cStringUsingEncoding: NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding];
}