zbar的安装和使用参见大神博客:http://blog.csdn.net/xiaxiazls/article/details/49822321
该类识别条形码以及纯英文的二维码效果很好,但是如果是整张图片(二维码只占一部分 )无法正常识别,另外如果是含有中文的话,识别出来的中文字符是乱码,仅仅通过utf8转gbk是不行的。
在正文开始之前先吐槽一下网上的“QRcodeDecoder”工程或者工具。网上传的代码都是2008年的,它也许是能够识别一些二维码,但是我是没有看到正确的识别结果的,其中的算法可以借鉴,但是然并卵。
笔者要识别的二维码中含有的中文字符是 “曹慧君”,简单使用zbar识别出来的是“²Ü»Û¾ý”,如果转UTF8则变成“虏脺禄脹戮媒”,这都是什么鬼?三个字符为什么会变成6个字符呢?如果你想通过简单的UTF8 GBK UNICODE转换得到正确的字符,那就是“痴心妄想”(因为笔者就是在这一条路上浪费了很多的时间)。
万般无奈之下,笔者静下心来,仔细学习了解了UTF8 UNICODE GBK包括BASE64编码(网上有说是base64编码,但是base64编码之后都是可见的字符和数字,不可能出现这些诡异的字符,所以不可能是base64位的)的原理和特点,以及之间的转换。后来一想,这些字符在计算机中只不过是二进制的数据,仔细看一下这些字符的二进制编码不就能够得到启发吗?
“²Ü»Û¾ý”对应的十六进制为:(省略了0x)32 a8 69 3f 3f 3f
“曹慧君”对应的十六进制为: b2 dc bb db be fd
至此,我们的输入和输出已经确定,怎么进行这样一个转变。
先看看utf8的原理,输入的二进制编码中(00110010 10101000 01101001 00111111 00111111 00111111)并没有110开头的,所以他也不可能是utf编码的字符。
另外“曹慧君”gbk转utf8得到的字符是“Ӝܛ߽ ” utf8 的曹慧君编码是:“e5 90 9b 20 0d 0a ”
“²Ü»Û¾ý”通过utf8 转 gbk得到的刚好是“虏脺禄脹戮媒”。
然后我们再看一下曹慧君的Unicode编码 66 fa 6167 541b 看起来也并没有什么关联。
暂时没有什么头绪,于是使用程序将“²Ü»Û¾ý”转成unicode试一下:
在程序中,通过utf-8 转Unicode中看到 三个中文字符的编码为“178 220 187 219 190 253”这是十进制的,178对应的十六进制是 b2,于是看到了希望,全部转换为十六进制之后为:“b2 dc bb db be fd ” 这不正是 “曹慧君”对应的gbk编码吗?瞬间是不是有点混乱的感觉。为什么经过转unicode之后就变成了所需要的gbk编码呢?
逆向推理的话,二维码编码时,是将gbk的编码当成unicode进行utf8编码进行保存的。所以解码时需要将之转换成unicode然后直接当成gbk的编码。这也许就是RawByte格式的解码方式吧。
当然,本次中文解码是针对RawByte格式的二维码编码方式的,如果是其他具体情况,还要具体分析。只要是获得了字符的各种编码,就在不断的尝试中进行试验吧,反正编码的方式并不多,转换也就那么几种,总是能够得到我们需要的解码方式的。只要深入到编码内部,就不愁解决不了问题,怕就怕害怕麻烦,不愿意自己深入了解,只是一味去copy别人的代码确实很难解决问题,因为我们面临的问题和别人的未必相同,所以要对症下药啊。