iOS開發(fā)-讀取各種編碼(GBK、UTF8)的TXT

這段時(shí)間再寫個(gè)看小說類的app,里面涉及到讀取TXT文件,目的是導(dǎo)入到APP中,讓用戶能開心的閱讀它。
考慮到TXT的來源不確定,鬼知道這個(gè)是什么編碼,用戶很可能在哪個(gè)角落找個(gè)破TXT導(dǎo)不進(jìn)來,然后說我APP有問題。??

網(wǎng)上找了一圈:發(fā)現(xiàn)沒有什么好的辦法,基本都是嘗試UFT8等編碼,出錯(cuò)了或者沒得到內(nèi)容再試另外一個(gè)編碼。代碼這樣的:

+ (NSString *)readTxtFromContentsOfFile:(NSString *)path {
    NSError *error = nil;
    NSStringEncoding encoding;
    // 使用常用編碼加載,可加載UTF8的
    NSString *aString = [NSString stringWithContentsOfFile:path 
usedEncoding:&encoding 
error:&error];
    if (error) {
        // 若出錯(cuò)則用GBK加載
        aString = [NSString stringWithContentsOfFile:path 
encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) error:&error];
    }
    if (!aString) {
        aString = @"";
    }
    return aString;
}

額,運(yùn)氣好,能找到,運(yùn)氣不好的話。。。

有沒什么好辦法能讀這個(gè)TXT的data,然后分析里面是什么編碼呢?

萬能的百度沒找到答案,有各種讀里面字節(jié)然后分析多少位的,有些編碼的字節(jié)是重合的,很難確定是什么編碼,不確定,那讀個(gè)txt豈不是全靠運(yùn)氣?!

就沒什么好辦法能正確的讀TXT?

找了半天發(fā)現(xiàn),其實(shí)蘋果在很早就給出了解決方案。
NSString 有個(gè)類別叫NSStringEncodingDetection,識別編碼它是專業(yè)的,能識別各種編碼。
看正確的轉(zhuǎn)換代碼:

    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    
    NSData * data = [NSData dataWithContentsOfFile:filePath];
    NSString * chapterContent = @"";
    BOOL lossy = NO;
    NSArray * enccList = @[@(NSUTF8StringEncoding),@(enc)];
    NSStringEncoding encc = [NSString stringEncodingForData:data 
    encodingOptions:@{NSStringEncodingDetectionSuggestedEncodingsKey:enccList} 
    convertedString:&chapterContent  usedLossyConversion:&lossy];
    NSLog(@"encc===%ld",encc);
    NSLog(@"chapterContent ===%@", chapterContent);

考慮到TXT文件gbk、utf8會多一些,所以我放到優(yōu)先嘗試?yán)锩媪恕?br> 代碼中的chapterContent就是讀取的txt的內(nèi)容,SuggestedEncodingsKey會優(yōu)先嘗試確認(rèn)是不是enccList給出來的編碼,讀取成功就結(jié)束,并且?guī)湍戕D(zhuǎn)換好了,不成功會繼續(xù)嘗試系統(tǒng)NSStringEncoding里面的編碼,都不成功的話,那沒辦法。
當(dāng)然encodingOptions里面還有各種其他值:

NSStringEncodingDetectionSuggestedEncodingsKey
NSStringEncodingDetectionDisallowedEncodingsKey
NSStringEncodingDetectionUseOnlySuggestedEncodingsKey
NSStringEncodingDetectionAllowLossyKey
NSStringEncodingDetectionFromWindowsKey
NSStringEncodingDetectionLossySubstitutionKey
NSStringEncodingDetectionLikelyLanguageKey
API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));

具體什么含義,看看里面的英文注釋就行。
為什么方法里面各種怪怪的&,可以看我之前的文章:iOS里面的多級指針

記錄一下,希望能幫到有需要的小伙伴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容