iOS上二維碼和一維碼識別系列一

來源:互聯網
上載者:User

這段時間在做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中進行編譯)


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.