とりあえず今まで書いたものをそのまま移動。 気が向いたら読みやすく整理する。
(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)
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)