使用NSXmlParser解析ISO-8859-1编码

3
我正在使用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。我建议发布一个示例(或示例链接),以便进一步诊断。 - Epsilon Prime
我在顶部看到了一行 <?xml version="1.0" encoding="ISO-8859-1"?>。我猜那是编码?我该如何设置 NSXmlParser 来使用它? - Ternary
Travis:这是包含编码声明的Prolog,是的。它可能是错误的!或者解析器可能没有正确使用它。无论哪种方式,不,您不应该需要告诉解析器;如果它识别编码的名称,它应该遵守声明(如是)。 - bignose
2个回答

3

XML规范建议在文档开头明确声明字符编码。您的输入文档可能已经有一个,这将告诉解析器必须使用哪种编码来解释字符输入。

如果没有明确声明,同一部分建议将输入视为UTF-8或UTF-16(如果实际上不是这两者中的任何一种,则该文档存在错误)。

因此,如果您的XML解析器忽略了明确的编码声明,或者在没有明确声明的情况下使用了错误的编码,则您的解析器正在错误地执行操作,需要修复以符合XML规范。


啊,好的,这很有道理。抱歉我有点新手。所以在我的XML文档顶部是一行<?xml version="1.0" encoding="ISO-8859-1"?>。那就是编码,对吗?所以我要告诉NSXmlParser这个编码? - Ternary
请注意,XML规范并不要求解析器理解除UTF-8和UTF-16之外的任何内容(第2.2节)。我从未使用过相关的XML解析器,所以我不能确定,但可能情况是NSXmlParser不支持超出这些范围的内容。 - Michael Madsen

0

看起来你的头部认为它是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文件的HTTP链接,那么有什么简单的方法可以将该文件下载到本地以便查看,而不需要对HTTP进行修改?我在Safari中尝试过,但还没有找到合适的方法。 - Ternary
为了调试目的,我倾向于在命令行上使用“curl”或“wget”,并告诉它们显示报头。 在浏览器中,我会使用Firefox以及像FireBug这样的扩展程序来显示标头。 要在浏览器中查看内容,我只需右键单击并选择“查看源代码”。 - Epsilon Prime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接