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];
4

2 回答 2

3

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

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

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

于 2010-03-21T00:35:09.287 回答
0

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

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

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

于 2010-03-22T18:18:46.063 回答