3

私は nsxmlparser を使用していますが、ISO-8859-1 を正しく解析して NSString にする方法を知りたいと思っています。

現在、2 バイト文字の Â で結果を取得しています。

私が使用している (私が作成したものではない) 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 仕様 では、ドキュメントのプロローグで明示的な文字エンコーディング宣言を推奨しています。入力ドキュメントにはおそらく 1 つあります。これにより、パーサーが文字入力を解釈するために使用する必要があるエンコーディングがわかります。

明示的な宣言がない場合、同じセクションで、入力を UTF-8 または UTF-16 として処理するように指定されています (これらのいずれかとしてエンコードされていないことが判明した場合、ドキュメントはエラーになります)。

そのため、XML パーサーが明示的なエンコード宣言を無視している場合、または明示的な宣言がない場合に間違ったエンコードを使用している場合、パーサーは Doing It Wrong™ であり、XML 仕様に準拠するように修正する必要があります。

于 2010-03-21T00:35:09.287 に答える
0

あなたのヘッダーはそれが ISO-8859-1 であると考えているようで、動作 (1 文字ではなく 2 文字で終わる) から、コンテンツの少なくとも一部が既に 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 に答える