在某些情况下,我确实需要在读取文件时知道文件的编码。有时我们可以按照Apple 的字符串编程指南建议的那样做:
读取未知编码的数据
如果您发现自己使用未知编码的文本,最好确保有一种机制可以纠正不可避免的错误。例如,Apple 的 Mail 和 Safari 应用程序具有编码菜单,TextEdit 允许用户使用明确指定的编码重新打开文件。
如果您被迫猜测编码(并注意在没有明确信息的情况下,这是猜测):
尝试 stringWithContentsOfFile:usedEncoding:error: 或 initWithContentsOfFile:usedEncoding:error: (或基于 URL 的等效项)。
这些方法尝试确定资源的编码,如果成功则通过引用返回使用的编码。
如果 (1) 失败,请尝试通过指定 UTF-8 作为编码来读取资源。
如果 (2) 失败,请尝试适当的传统编码。
这里的“适当”取决于具体情况;它可能是默认的 C 字符串编码,可能是 ISO 或 Windows Latin 1,或其他,取决于您的数据来自何处。
最后,您可以从 Application Kit 中尝试 NSAttributedString 的加载方法(例如 initWithURL:options:documentAttributes:error:)。
这些方法尝试加载纯文本文件,并返回使用的编码。它们可以用于或多或少的任意文本文档,如果您的应用程序在文本方面没有特殊专业知识,则值得考虑。它们可能不适用于非自然语言文本的基础级工具或文档。
在这里我遇到了一些问题。有时我可以知道错误。例如,当我使用 UTF8 方式读取 GB2312 编码文件时,我会得到 nil,所以我知道错误。但是当我使用 BIG5 方式读取 GB2312 编码文件时,我无法知道错误。
NSAttributedString 的 init 方法可能在 Mac 上可以工作,但是到了 iOS 就需要 iOS7,不太好。
我也在cocoabuilder 上搜索它并找到一些关于它的讨论,但也在 Mac 上。那么在 iOS 上呢?