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() で書き出すようにするのが良いかもしれません。
- 「System.IO.StringWriter の Encoding」にコメントを書く
- 前(古い): 2003年1月15日(Wednesday)のえび日記
- 次(新しい): 2003年1月17日(Friday)のえび日記