【问题标题】:Parsing ISO-8859-1 w/ NSXmlParser使用 NSXmlParser 解析 ISO-8859-1
【发布时间】:2010-03-21 00:22:44
【问题描述】:

我正在使用 nsxmlparser,想知道如何将 ISO-8859-1 正确解析为 NSString。

目前,我正在获得两字节字符的结果。

我使用的 XML(不是我创建的)以 <?xml version="1.0" encoding="ISO-8859-1"?> 开头

这是我正在使用的基本调用(省略了 NSThread 调用)。

NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:sampleFileName ofType:@"xml"];

NSString *xmlFileContents = [NSString stringWithContentsOfFile:xmlFilePath encoding:NSUTF8StringEncoding error:nil];

NSData *data = [xmlFileContents dataUsingEncoding:NSUTF8StringEncoding];

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

[parser setDelegate:self];

[parser parse];

【问题讨论】:

  • 看起来您的源编码可能至少部分是 UTF-8。我建议发布样本(或样本链接),以便进一步诊断。
  • 我在顶部看到 这一行。我假设那是编码?如何设置 NSXmlParser 以使用它?
  • Travis:这是包含编码声明的序言,是的。可能是错的!或者解析器可能没有正确使用它。无论哪种方式,不,您不需要告诉解析器;它应该按原样遵守声明(如果它识别编码的名称)。

标签: xml iphone character-encoding nsxmlparser


【解决方案1】:

XML specification 建议在文档序言中使用明确的character encoding declaration。您的输入文档可能有一个;这将告诉您解析器必须用来解释字符输入的编码。

在没有显式声明的情况下,同一部分说将输入视为 UTF-8 或 UTF-16(如果结果不是编码为,则该文档是错误的任何一个)。

因此,如果您的 XML 解析器忽略显式编码声明,或者在没有显式声明的情况下使用错误的编码,则您的解析器做错了™,需要进行修复以符合 XML 规范。

【讨论】:

  • 嗯,好的。这就说得通了。抱歉,我对此有点陌生。所以在我的 XML 文档的顶部是行 。那是编码对吗?所以我必须告诉 NSXmlParser 这个?
  • 请注意,XML 规范不要求解析器理解 UTF-8 和 UTF-16 以外的任何内容(第 2.2 节)。我从未使用过有问题的 XML 解析器,所以我不确定,但 NSXmlParser 可能不支持除此之外的任何内容。
【解决方案2】:

看起来您的标头认为它是 ISO-8859-1,并且从行为(以两个字符而不是一个字符结尾)听起来至少您的一些内容已经是 UTF-8。这看起来像一个经典的“双 utf-8 编码问题”,其中已经编码为 UTF-8 的内容再次编码为 UTF-8。将标题更改为 UTF-8,它可能会开始工作。您可以尝试始终以 UTF-8 的形式运行您的代码,然后按照它所说的那样运行(因为如果不是 UTF-8,您会收到解析器错误)。

最后请注意,如果通过 HTTP 提供 XML 文件的编码,则它会被 HTTP 标头覆盖。

不确定它是否适合您的需求,但我喜欢parsing XML at all costs 上的这篇文章。作为一个例子,我要指出我也喜欢 feedparser (Python),因为它是最好的 XML 不惜一切代价的 XML 解析器(非常适合想法,但不适合您的情况)。

【讨论】:

  • 很棒的信息谢谢。因此,如果我有一个指向 XML 文件的 http 链接,那么在没有 HTTP 修改的情况下,在本地下载该文件供我查看的简单方法是什么?我在 Safari 中尝试过,但还没有找到。
  • 出于调试目的,我倾向于在命令行上使用curlwget 并告诉他们显示标题。在浏览器中,我将使用 Firefox 和 FireBug 之类的扩展来显示标题。要在浏览器中查看内容,我只需右键单击它并选择“查看源代码”。
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2015-05-12
  • 2015-10-11
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多