水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 2003年のえび日記 > 2003年1月 > 2003年1月16日(木曜日)

2003年1月16日(木曜日)

System.IO.StringWriter の Encoding

C# では、System.IO.StringWriter の Encoding は UTF-16 で固定です。このプロパティは取得専用で設定できませんし、コンストラクタでエンコーディングを指定するようなことも出来ません。どうあがいても UTF-16 です。おそらく、システム実装内部のエンコーディングで固定となるのがあるべき姿なのでしょう。

それはそれで問題ない、と言いたいところなのですが一つ問題があって、System.Xml.XmlDocument.Save() メソッドに StringWriter を渡すと、そのエンコーディング指定に従って XML 宣言の encoding 疑似属性を書き換えてしまうのです。

最終的に UTF-8 で出力する事を目的として encoding="UTF-8" としておいても、途中で StringWriter に書き出すと、勝手に encoding="UTF-16" に書き換えられてしまいます。それを知らずに UTF-8 に変換して出力すると、XML 宣言の内容と実際の文字符号化方式が異なるリソースが出来るわけで、いやはや。

StringWriter ではなく System.Xml.XmlTextWriter を使えば Encoding を指定できるのですが、これだと System.Web.HttpResponse.Write() に渡せないわけで、何とも。XmlTextWriter でいったんテンポラリファイルに書き出して、System.Web.HttpResponse.WriteFile() で書き出すようにするのが良いかもしれません。

関連する話題: えび日記 / コンピュータ / プログラミング / C# / .NET

最近の日記

関わった本など