這段時(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里面的多級指針
記錄一下,希望能幫到有需要的小伙伴。