3

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

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

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

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

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

4

2 回答 2

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];

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

{
    CharacterEncoding = 30;
    DocumentType = NSPlainText;
    UTI = "public.plain-text";
}
于 2020-11-22T17:11:19.483 回答
0

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

于 2013-03-14T01:31:49.560 回答