美文网首页
iOS开发-读取各种编码(GBK、UTF8)的TXT

iOS开发-读取各种编码(GBK、UTF8)的TXT

作者: 妖精的尾巴毛 | 来源:发表于2019-12-01 16:18 被阅读0次

这段时间再写个看小说类的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里面的多级指针

记录一下,希望能帮到有需要的小伙伴。

相关文章

  • iOS开发-读取各种编码(GBK、UTF8)的TXT

    这段时间再写个看小说类的app,里面涉及到读取TXT文件,目的是导入到APP中,让用户能开心的阅读它。考虑到TXT...

  • 文件操作

    文件编码问题 1、node在读取文件的时候是不支持读取GBK编码的文件,一般都是utf8,所以有的时候我们需要读取...

  • iOS判断.txt文档编码格式

    如果需要判断导入项目中的 .txt格式文件的编码格式(GBK/UTF-8......),主要适用于读取.txt文件...

  • 关于编码

    编码的三种大类 ANSI(GBK) ANSI即为GBK编码以前是GB2312,GBK和UTF8为最常用的编码格式,...

  • 'gbk' codec can't decode byte 0x

    python读取txt文件的时候出现下面错误 这是因为我们的txt文件里面的内容编码格式不是'gbk',我们需要打...

  • utf-8与GBK的区别

    UTF8是国际编码,它的通用性比较好,GBK是国家编码,通用性比UTF8差。 GBK包含全部中文字符;UTF-8则...

  • iOS emoji 表情 处理

    数据库编码是GBK编码,苹果系统的编码格式是UTF8编码,所以在把emoji表情存到GBK编码的数据库的就会出现乱...

  • django GBK编码

    不小心遇到了 GBK 与 UTF8 编码的选择问题环境:python3.6 django2.0由于django开发...

  • ANSI、GB2312、GBK、DBCS、UCS、UNICODE

    附件:查表发实现 UTF8 与 GBK 编码互转的纯 C 源码utf-gbk.zip 一、编码历史与区别 一直对...

  • 关于导入txt文件出现无法读取的问题

    如果您在导入txt文件后出现无法读取的问题,例如提示无法使用utf8编码打开文件,请在windows系统下使用no...

网友评论

      本文标题:iOS开发-读取各种编码(GBK、UTF8)的TXT

      本文链接:https://www.haomeiwen.com/subject/fbwzwctx.html