【问题标题】:NSString from text file with unknown encodingNSString 来自编码未知的文本文件
【发布时间】:2013-01-31 09:06:41
【问题描述】:

我正在尝试根据 Apple 的文档显示具有未知编码的文本文件内容:

尝试 stringWithContentsOfFile:usedEncoding:error: 或 initWithContentsOfFile:usedEncoding:error:(或基于 URL 的等效项)。这些方法尝试确定资源的编码,如果成功则通过引用返回使用的编码。

如果 (1) 失败,请尝试通过指定 UTF-8 作为编码来读取资源。

如果 (2) 失败,请尝试适当的传统编码。这里的“适当”取决于具体情况;它可能是默认的 C 字符串编码,可能是 ISO 或 Windows Latin 1,或其他,具体取决于您的数据来自何处。

这并不总是有效。有没有更可靠的方法检测编码?

【问题讨论】:

  • 你最好的办法是制作一个 c++ 文件来处理读取操作

标签: iphone ios encoding utf-8 nsstring


【解决方案1】:

您应该使用可以检测编码的 NSAttributedString。经过长时间测试不同的解决方案,我使用它:

NSError *error;
NSDictionary *options = [NSDictionary dictionary];
NSDictionary *attributes;
NSAttributedString *theString = [[NSAttributedString alloc] initWithURL:fileURL options:options documentAttributes:&attributes error:&error];
NSInteger detectedEncoding = [[attributes objectForKey:@"CharacterEncoding"] integerValue];

我测试了来自许多来源/环境的许多文件,它似乎很有效(因此您应该检查error 是否为nil)。对于从 Excel 导出的普通 csv 文件,我得到了这个属性字典(30 值表示 NSMacOSRomanStringEncoding:

{
    CharacterEncoding = 30;
    DocumentType = NSPlainText;
    UTI = "public.plain-text";
}

【讨论】:

    【解决方案2】:

    如果你不提前知道数据的编码,那么必须通过对原始数据的分析来猜测,这有时会导致错误的猜测,从而导致解码不可靠。如有疑问,只需询问用户使用哪种编码即可。

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 2021-04-29
      • 2018-12-29
      • 1970-01-01
      • 2011-09-29
      • 2015-03-20
      • 2014-08-17
      相关资源
      最近更新 更多