Notice : 内容無保証。禁無断転載。リンク自由。

XML ドキュメントの charset

とりあえず今まで書いたものをそのまま移動。 気が向いたら読みやすく整理する。

(2003/05/15)

発端〜覚書

mozilla で、ローカルの XML ファイルは表示できるのに、 サーバから送られてくる XML ファイルは表示できない状態になってるので調査中。 ソースを見てもローカルのものと変わりが無いので、あとはもう HTTP ヘッダの有無ぐらいしか違いを思いつかなく、 そのへんに的をしぼって勉強しなおし。

以下、ざっと調べただけなので、間違ってるかもしれないけど覚書。

と、このへんまでは知ってたけど、じゃあ、charset パラメータが省略された時はどうなるか。 (ここから先は全然知らんやった。)

明示的な charset パラメータが送り側から供給されない時に、 HTTP 経由で受信される "text" タイプのメディアサブタイプは、 デフォルトの charset である "ISO-8859-1" という値を持つと定義される。

ふむ。HTTPボディが Shift_JIS とかの時に省略すると文字化けの可能性があるのね。

じゃあ実際どうなってるのかと、某サーバーの送ってくる HTTPヘッダを telnet で GETして見てみると、 text/html に対する charset が省略されている。

それでも文字化けしないのは、UA が文字コードを自動判定しているから。 (逆に文字化けする時は、UA の自動判定が失敗しているか、あるいはそもそも自動判定していないから。)

HTTPボディ(= .html ファイル) 中の meta による文字コードの指定とかは、 サーバ側を助けるためではなく、 (= サーバが作成する HTTP ヘッダの Content-Type に反映するために存在するのでは無く、) UA 側の自動判定を助けるために存在していると。

(逆に、サーバ側は UA 側の自動判定をあてにして、HTTPヘッダの作成を手抜きしている?) (憶測)

以上は、.html ファイルに関してだったんだけど、.xml ファイルの時はどうか。

某サーバの送ってくる HTTPヘッダを telnet で GET してみると、 メディアタイプは text/xml で、 charset は省略されていた。

[RFC2616] だけを見ると、このHTTPボディの文字コードは ISO-8859-1 になりそうなんだけど、 [RFC3023] の text/xml の説明を見ると、 省略時は US-ASCII (ISO-8859-1 のサブセットやね。当然 Shift_JIS のコードは文字化けする) になるとのこと。

これだけならあまり変らないんだけど、さらに詳しく [RFC3023] を読んでみると、 text/html で charset を省略した時の HTTPボディの文字コードは、 HTTPボディに何が書いてあっても関係なく US-ASCII として扱うべきだと。

つまり、text タイプメディアの文字コードの判定は、 .html ファイルの時には サーバ側がやらなくても UA 側で助けてくれるのが期待できたけど、 .xml ファイルでは サーバ側でやるしかなく、UA 側の助けは期待できないということ。

うちの .xml ファイルが Sleipnir (IE 6) で表示できちゃってるのは、 [RFC3023] 違反っぽい気がする。(いや、まぁ、助けられてるんだけど。)

もひとつ。[RFC3023] では application/xml というメディアタイプについても説明がされていて、 こっちはサーバ側で charset を省略しても XML 宣言中の encoding を見て文字コードを判定してくれるみたい。 (encoding も省略された時は、UTF-8 か UTF-16 のどっちかならちゃんと処理できるらしい。)

が、現状 application/xml を認識できない UA もあるみたい。 (.htaccess とか使えないサーバなので具体的な確認ができず。)

(続く、かも)

(2003/05/08)

まとめ

[RFC3023] 8. Examples まとめ (内容無保証)
section media-type charset {BOM} endocing 結果
8.1 text/xml utf-8 (無し) utf-8 utf-8
8.2 text/xml utf-16 {BOM} utf-16 no content-transfer-encoding is necessary
8.2 text/xml utf-16 {BOM} (無し) no content-transfer-encoding is necessary
8.3 text/xml utf-16be (無し) utf-16be no content-transfer-encoding is necessary
8.4 text/xml iso-2022-kr (無し) iso-2022-kr no content-transfer-encoding is necessary
8.5 text/xml (無し) {BOM} utf-16 us-ascii
8.5 text/xml (無し) {BOM} (無し) us-ascii
8.5' text/xml (無し) (無し) Shift_JIS us-ascii
8.5' text/xml (無し) (any) (any) us-ascii
8.6 application/xml utf-16 {BOM} utf-16 utf-16
8.6 application/xml utf-16 {BOM} (無し) utf-16
8.7 application/xml utf-16be (無し) utf-16be utf-16be
8.8 application/xml iso-2022-kr (無し) iso-2022-kr no content-transfer-encoding is necessary
8.9 application/xml (無し) {BOM} utf-16 utf-16
8.9 application/xml (無し) {BOM} (無し) utf-16
8.10 application/xml (無し) (無し) (無し) utf-8
8.11 application/xml (無し) (無し) iso-10646-usc-4 iso-10646-usc-4
8.11' application/xml (無し) (無し) Shift_JIS Shift_JIS
8.20 text/xml utf-8 (無し) iso-8859-1 utf-8 (charset と encoding が矛盾したら charset の勝ち)

(2003/05/13)