[PHP-users 178] Re: 本家マニュアルの文字コード

SAWADA Hodaka php-users@php.gr.jp
Fri, 22 Jun 2001 04:05:42 +0900


At Fri, 22 Jun 2001 01:22:03 +0900,
renzo wrote:

> > 問題1:HTTPヘッダのcharsetと、文書の符号化方式が異なる。
> > 問題2:HTTPヘッダのcharsetと、文書中のcharset(metaタグ中)が異なる。
> > 問題3:Netscape6は、ユーザの指定よりHTTPヘッダの内容を優先する(?)
> 個人的に(PHPから脱線しますが)
> 1:まずHTTPヘッダを確認すること
> 2:HTTPヘッダにcharsetを付与できる
> を学びました。また今まで漠然と
> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
> と記述しておりましたが、「http-equiv」の意味が分かりました。
> (HTTPヘッダに項目を追加する、違っていたらすいません)

違います。

まずは、
http://www.fxis.co.jp/DMS/sgml/xml/saloon/html_correct_charset.html
これを読んでみてください。


HTTP において、

header

body

という構造があって、header に text/html と書いてあれば、
ブラウザは body が text/html であると、解釈する準備ができるわけで、
body を開けてから「お、text/html かいな」と
やっているわけではありません。

同様に、HTTP header に EUC-JP と書いてあれば、
「body は EUC-JP か」と、EUC-JP のつもりで解釈を進めるのです。

つまり、HTTP body である HTML で別の charset を宣言しても、
時すでに遅し、ブラウザは HTTP header の時点で
EUC-JP として作業を開始してしまっているのです。


これをふまえた上で、PHP 的に作業しようとすると、
HTTP body である HTML に <meta ...> を書くのが重要なのではなく、
HTTP header にこそ書かないとだめということです。

でも、PHP3 国際化版だと Content-Type については
よきに計らってくれるというありがたい機能があるので、
あまり問題になりにくいのかもしれません。
# 開発者の方々、ご苦労様です。
-------------------------

あと、http://www.php.net:8000/manual/ja/html/ を見たいならば、
local に HTTP header の charset をたたき落とす proxy を
PHP で作ってみてはいかがでしょうか。

手順としては、
http://example.co.jp/proxy.php3?URI=http://www.php.net:8000/manual/ja/html/
みたいな感じでアクセスして、

proxy.php3 では、$URI を open して、HTTP header の charset を削って、
あとはそのまま流せば OK でしょう。

注意としては、外部から使われないようにアクセス制限をかけないと、
いやなことになるかもってことですかね。

HTTP とはなんぞやというのがわかる、いい演習になると思いますので、
是非チャレンジしてみてください。
# 完成したら ML で発表しましょう! あとから来る人に喜ばれますよ。
-- 
         =^^= HODA =^^=          http://www.tail.gr.jp/~hoda/
澤田保隆@しっぽアルゴリズム情報研究所  mailto:hoda@tail.gr.jp