他の誰かが与えた答えを拡張するには:
次の 2 つの可能性があります。
- ファイルは実際には としてエンコードされて
UTF-8
いますが、xml パーサーによって として解釈されていますISO-8859-1
。
- ファイルは実際には としてエンコードされて
ISO-8859-1
いますが、xml パーサーによって として解釈されていますUTF-8
。
é
どちらがどちらであるかを判断するには、 inで何が起こるかを見てくださいSébastien
。私が想像できる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 パーサーがファイルの内容を取得するまでに、バイトが既に文字列として解釈されているため、エンコーディングを変更するには遅すぎることです。