windows上很多文字未必是用UTF8,所以在iOS上讀取的時候,如何得到檔案的編碼是個問題。網上有很多讀取中文的例子,但是那些不夠通用。比如說要讀取日文,韓文,阿拉伯文等等的時候,就不行了(雖然一般的app不一定會有這樣的需求)。
NSString自己帶一個函式:
+ (instancetype)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error;
如果String建立成功,enc會返回使用的NSStringEncoding。但是這個方法對於NSStringEncoding以外的編碼都不一定能成功建立NSString,同時也不會返回error。
Apple 的官方文件提供了讀取未知encoding資料的一些參考步驟:
簡單的總結,就是不停的用encoding去測試。這其中有個小技巧,根據程式面向的使用者,把用到的encoding按可能性排列下,這樣最有希望獲得需要的結果。
雖然Apple的文件給出了這樣的解決方案,但是發現很多閱讀App讀取各種編碼方式的檔案,毫無壓力。因此,這裡一定有其他方法。問了某道友,說chardet可以,可是一搜,發現是python實現!雖然沒結果,不過我發現這是個非常普遍的問題。於是,再次搜尋查詢,找到了BOM,找到了mozzilla charset detector,找到了uchardet。uchardet的原始碼在github上。他的基本原理好像也是用編碼去檢測,誰先返回,就確認是哪個編碼(這裡不確定,未深究)。
專案是C/C++實現,直接新增進iOS工程,記得修改使用到的檔案字尾為mm,執行後測試,發現能很好的識別我遇到的幾種編碼檔案。專案中有使用的例子,就不貼圖說明使用過程了。
需要說明的是,對於需要使用kCFStringEncodingGB_18030_2000來建立的中文文字,識別出來的居然是IBM855。 google了下,也不知道IBM855是啥意思。為了趕時間,暫時對需要的幾種編碼做了對映。
如果有哪位知道的,麻煩指點指點,這裡先謝過了。
本文已同步到: http://icocoa.tk/2013/11/16/ios文字檔案的編碼檢測/,歡迎訪問