来自具有未知编码的文本文件的NSString

时间:2013-01-31 09:06:42

标签: iphone ios encoding utf-8 nsstring

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

  

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

     

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

     

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您应该使用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";
}