0

XML ストリームを読み取ってコレクションにロードしようとしています。

これは機能しますが、特殊文字の読み取りに問題があります。

たとえば、私のxmlが次のようになっている場合

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<persons>
<person>
 <firstname>
 <![CDATA[ Sébastien ]]> 
  </firstname>
  <lastname>
   <![CDATA[Ørvåk]]> 
  </lastname>
</person>
</persons>

linq like を使用して値を読み取ろうとします

var persons = from p in doc.Elements("persons").Elements("person") select p;
string firstname = person.Element("firstname").Value;
string lastname = person.Element("lastname").Value;

しかし、Ørvåk Ø と å / Sébastien では、é は奇妙な文字を与えます。

誰が何が悪いのか知っていますか?エンコーディング ISO-8859-1 を使用していないと思います。

ありがとう

4

3 に答える 3

3

他の誰かが与えた答えを拡張するには:

次の 2 つの可能性があります。

  1. ファイルは実際には としてエンコードされてUTF-8いますが、xml パーサーによって として解釈されていますISO-8859-1
  2. ファイルは実際には としてエンコードされてISO-8859-1いますが、xml パーサーによって として解釈されていますUTF-8

éどちらがどちらであるかを判断するには、 inで何が起こるかを見てくださいSébastien。私が想像できる2つの可能性があります:

  1. " é" は 2 つの異なる文字になります - おそらく " é"
  2. " é" は単一の無意味な文字または " ?" になり、おそらく " b" も名前から欠落していますSébastien

最初のケースでは、ファイルはあなたが思っているものではありません。(UTF-8データとしてプログラムに渡されますが、プログラムはそれを として解釈しようとしていますISO-8859-1) 16 進エディタなどで xml ファイルを調べて、ディスク上のバイト数を表示できます。

2 番目のケースでは、localhost 上の HTTP サーバーがこのファイルをどのように処理しているかを確認します。(プログラムはバイトISO-8859-1形式で取得していますが、それらを として解釈していますUTF-8) Windows でこれを行う最も簡単な方法は、プロンプトを開いてcmd次のコマンドを実行することです。telnet localhost 80

ウィンドウが表示されたら、次の行を入力 (またはスタック オーバーフローからカット アンド ペースト) し、Enter キーを 2 回押します。警告: 何を入力しているかを確認することはできません。大文字と小文字を区別することが重要です。

GET /Test/person.xml HTTP/1.0

応答で、 で始まる行を探しますContent-Type。これにより、Web サーバーがローカルでファイルをどのように提供しているかがわかります。

更新Webclient: ファイルを確認したところ、実際には iso-8859-1 であるため、ファイルをダウンロードするように指示する前に、インスタンスの .Encoding 属性を次のように設定することをお勧めします。

client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1")

DownloadBytesまたは、メソッドの代わりにメソッドを使用してDownloadString、バイトを解析して xml ファイルにすることもできます。現在の問題は、xml パーサーがファイルの内容を取得するまでに、バイトが既に文字列として解釈されているため、エンコーディングを変更するには遅すぎることです。

于 2009-06-16T22:25:30.630 に答える
0

フォローアップで言及した XML ファイルは完全に正しいものです。したがって、バグは Javascript コードに固有のものです。

于 2009-06-16T09:24:51.673 に答える