使用Zbar进行二维码识别 中文字符解码 RawBytes

     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别人的代码确实很难解决问题,因为我们面临的问题和别人的未必相同,所以要对症下药啊。

    

你可能感兴趣的:(c++应用程序)