C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Web上から読んだXMLがUTF-8の場合に文字化けします

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■94982 / inTopicNo.1)  Web上から読んだXMLがUTF-8の場合に文字化けします
  
□投稿者/ c#初心者 (6回)-(2020/06/08(Mon) 23:50:46)

分類:[C#] 

C#です。

WebAPIを使ってアプリケーションを作っています。

例:
response = webClient.UploadString("https://example.com/api", "POST", postData);

responseで取得した文字列はxmlデータなのですが、

xdoc = XDocument.Parse(response);

とすると例外エラーが起きます。
レスポンスデータを確認するとマルチバイト文字が文字化けを起こしており、それがxmlタグに作用してxml文法が崩れていたためパースに失敗していました。

調べましたらC#は内部エンコーディングとしてUTF-16を使っており、これがWebからUTF-8のソースを取得した時に文字化けの原因となることに行き着きました。
前述の通り内部エンコーディングがUTF-16なので、webClient.UploadString()の戻り値の時点で文字化けを起こしており、行き詰まっております。
一般的には日本語の含まれるWeb上から得られるXMLデータはどのようにパースして利用するべきなのでしょうか。
引用返信 編集キー/
■94983 / inTopicNo.2)  Re[1]: Web上から読んだXMLがUTF-8の場合に文字化けします
□投稿者/ 魔界の仮面弁士 (2745回)-(2020/06/09(Tue) 00:43:03)
No94982 (c#初心者 さん) に返信
> response = webClient.UploadString("https://example.com/api", "POST", postData);

UploadString を呼ぶ前に、webClient.Encoding プロパティに何を設定していますか?

何も設定していなければ、Encoding.Default 相当になるはずなので、
おそらくは CodePage 932 (Shift_JIS) としてアップロード時にエンコード処理されていると思います。

一方、ダウンロード時には、サーバー側が Content-Type ヘッダーで Charset が明示していれば
それが優先的に利用されます。もしも Charset が返されなかった場合は、データ先頭に
BOM があればそれが利用され、BOM も無かった場合には、webClient.Encoding にてデコード処理されます。



> responseで取得した文字列はxmlデータなのですが、
> xdoc = XDocument.Parse(response);
> とすると例外エラーが起きます。

それは、response の内容が既に破損していた…ということですよね?

Parse は、バイナリではなく String を受け取るものなので、それ自体には
encoding という概念はありません。(文字集合という概念ならあります)


文字化けが問題になるようなら、UploadString ではなく UploadData を使うようにして、
string と byte[] の相互変換を、明示的に行ってやるという選択肢もあります。
引用返信 編集キー/
■94984 / inTopicNo.3)  Re[2]: Web上から読んだXMLがUTF-8の場合に文字化けします
□投稿者/ c#初心者 (7回)-(2020/06/09(Tue) 02:01:06)
> UploadString を呼ぶ前に、webClient.Encoding プロパティに何を設定していますか?

こちらが未設定でした。

webClient.Encoding = System.Text.Encoding.UTF8;

上記のようにしたところ問題が解決しました。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ