解析ISO-8859-1 w / NSXmlParser

时间:2010-03-21 00:22:45

标签: xml iphone character-encoding nsxmlparser

我是nsxmlparser的用户,我想知道如何正确地将ISO-8859-1解析为NSString。

目前,我得到两个字节字符的结果w /Â。

我正在使用的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];

2 个答案:

答案 0 :(得分:3)

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

在没有明确声明的情况下,同一部分说将输入视为UTF-8或UTF-16 (如果结果不是编码为其中任何一个)。

因此,如果您的XML解析器要么忽略显式编码声明,要么使用错误的编码(如果没有明确的声明),那么您的解析器就是“做错了”,需要修复以符合XML规范。

答案 1 :(得分:0)

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

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

不确定它是否适用于您的需要,但我喜欢parsing XML at all costs上的这篇文章。作为一个例子,我会指出我也喜欢feedparser(Python)作为最好的XML全部成本XML解析器(非常适合创意而不是你的情况)。