2

在某些情况下,我确实需要在读取文件时知道文件的编码。有时我们可以按照Apple 的字符串编程指南建议的那样做:

读取未知编码的数据

如果您发现自己使用未知编码的文本,最好确保有一种机制可以纠正不可避免的错误。例如,Apple 的 Mail 和 Safari 应用程序具有编码菜单,TextEdit 允许用户使用明确指定的编码重新打开文件。

如果您被迫猜测编码(并注意在没有明确信息的情况下,这是猜测):

  1. 尝试 stringWithContentsOfFile:usedEncoding:error: 或 initWithContentsOfFile:usedEncoding:error: (或基于 URL 的等效项)。

    这些方法尝试确定资源的编码,如果成功则通过引用返回使用的编码。

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

  3. 如果 (2) 失败,请尝试适当的传统编码。

    这里的“适当”取决于具体情况;它可能是默认的 C 字符串编码,可能是 ISO 或 Windows Latin 1,或其他,取决于您的数据来自何处。

  4. 最后,您可以从 Application Kit 中尝试 NSAttributedString 的加载方法(例如 initWithURL:options:documentAttributes:error:)。

    这些方法尝试加载纯文本文件,并返回使用的编码。它们可以用于或多或少的任意文本文档,如果您的应用程序在文本方面没有特殊专业知识,则值得考虑。它们可能不适用于非自然语言文本的基础级工具或文档。

在这里我遇到了一些问题。有时我可以知道错误。例如,当我使用 UTF8 方式读取 GB2312 编码文件时,我会得到 nil,所以我知道错误。但是当我使用 BIG5 方式读取 GB2312 编码文件时,我无法知道错误。

NSAttributedString 的 init 方法可能在 Mac 上可以工作,但是到了 iOS 就需要 iOS7,不太好。

我也在cocoabuilder 上搜索它并找到一些关于它的讨论,但也在 Mac 上。那么在 iOS 上呢?

4

1 回答 1

1

您可以使用 stringWithContentsOfFile:usedEncoding:error:,它除了返回新字符串之外,还返回所使用的编码。

但是您并不总是能够确定文件的编码。

于 2013-09-17T13:47:27.660 回答