这段时间再写个看小说类的app,里面涉及到读取TXT文件,目的是导入到APP中,让用户能开心的阅读它。
考虑到TXT的来源不确定,鬼知道这个是什么编码,用户很可能在哪个角落找个破TXT导不进来,然后说我APP有问题。💣
网上找了一圈:发现没有什么好的办法,基本都是尝试UFT8等编码,出错了或者没得到内容再试另外一个编码。代码这样的:
+ (NSString *)readTxtFromContentsOfFile:(NSString *)path {
NSError *error = nil;
NSStringEncoding encoding;
// 使用常用编码加载,可加载UTF8的
NSString *aString = [NSString stringWithContentsOfFile:path
usedEncoding:&encoding
error:&error];
if (error) {
// 若出错则用GBK加载
aString = [NSString stringWithContentsOfFile:path
encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) error:&error];
}
if (!aString) {
aString = @"";
}
return aString;
}
额,运气好,能找到,运气不好的话。。。
有没什么好办法能读这个TXT的data,然后分析里面是什么编码呢?
万能的百度没找到答案,有各种读里面字节然后分析多少位的,有些编码的字节是重合的,很难确定是什么编码,不确定,那读个txt岂不是全靠运气?!
就没什么好办法能正确的读TXT?
找了半天发现,其实苹果在很早就给出了解决方案。
NSString 有个类别叫NSStringEncodingDetection,识别编码它是专业的,能识别各种编码。
看正确的转换代码:
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会多一些,所以我放到优先尝试里面了。
代码中的chapterContent就是读取的txt的内容,SuggestedEncodingsKey会优先尝试确认是不是enccList给出来的编码,读取成功就结束,并且帮你转换好了,不成功会继续尝试系统NSStringEncoding里面的编码,都不成功的话,那没办法。
当然encodingOptions里面还有各种其他值:
NSStringEncodingDetectionSuggestedEncodingsKey
NSStringEncodingDetectionDisallowedEncodingsKey
NSStringEncodingDetectionUseOnlySuggestedEncodingsKey
NSStringEncodingDetectionAllowLossyKey
NSStringEncodingDetectionFromWindowsKey
NSStringEncodingDetectionLossySubstitutionKey
NSStringEncodingDetectionLikelyLanguageKey
API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
具体什么含义,看看里面的英文注释就行。
为什么方法里面各种怪怪的&,可以看我之前的文章:iOS里面的多级指针
记录一下,希望能帮到有需要的小伙伴。