我正在尝试根据Apple的文档显示具有未知编码的文本文件内容:
尝试stringWithContentsOfFile:usedEncoding:error:或initWithContentsOfFile:usedEncoding:error :(或基于URL的等价物)。这些方法尝试确定资源的编码,如果成功通过引用返回使用的编码。
如果(1)失败,请尝试通过将UTF-8指定为编码来读取资源。
如果(2)失败,请尝试适当的遗留编码。这里的“适当”取决于具体情况;它可能是默认的C字符串编码,可能是ISO或Windows Latin 1,或其他内容,具体取决于数据的来源。
这并不总是有效。是否有更可靠的方法来检测编码?
答案 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";
}