[PHP-users 8312] Re: GET メソッドでの文字化けについて

OHTA Hideki php-users@php.gr.jp
Thu, 27 Jun 2002 00:52:05 +0900


太田です。

At 19:05 02.6.26 +0900, Yasuo Ohgaki wrote:
>>>  ブラウザが POST する文字コードは、ページが記述されている文字コードに
>>>合わせるというのは、まぁ一般的な挙動だと思いますが、GET に関してはその
>>>ような前提も全くないのが現状だと思います。
>> 
>> 
>> ブラウザからサーバーに送られる文字コードは基本的には信用していません。
>> 上記の用にPOST する文字コードにかぎってページ(HTML)自体の文字コードで
>> 送信されるという話ははじめて聞きました。これは確かでしょうか?
>
>私の記憶では仕様です。が、いいかげんなエンコーディングで送
>信してくる古い(?)ブラウザがあるようです。

これは、必ずしもブラウザが悪いわけではありません。
WebサーバとWebブラウザの間に文字エンコーディング変換を行うproxyが
介在すると、Webサーバが送信した文字エンコーディングと異なるエンコー
ディングで送信されることがあります。

            ----(EUC-JP)--->       --(Shift_JIS)-->
 Web Server                  Proxy                  UA
            <--(Shift_JIS*)-       <--(Shift_JIS*)--
*: URIエンコード済み

>HTMLの仕様ではフィールド毎にエンコーディングを指定
>する事もできます。この機能はヨーロッパでは便利かもし
>れませんが、日本は必要ない機能と思います。

???
そんな仕様は(少なくともHTML4.01には)ありません。
accept-charset属性はform要素にしか適用できません。

>
>> GET で前提がないのはHTTP の仕様なのでしょうか?
>
>HTTPではなく、HTMLの仕様なのでHTML4.0.1の仕様を見てみ
>ました。
>
>http://www.w3.org/TR/1999/REC-html401-19991224/
>の 17.13.3 Processing form dataには
(snip)
>と書かれています。この事からHTML4ではGETもContent-Type
>と同じ文字エンコーディングを使う事になっていると理解してい
>ます。

それより前の17.13.1に、
====
Note. The "get" method restricts form data set values to
 ASCII characters. Only the "post" method (with
 enctype="multipart/form-data") is specified to cover the
 entire [ISO10646] character set.
====
と書かれています。
GETメソッド(およびPOSTメソッドのenctype="application/x-www-form-urlencoded")
では、そもそもASCII以外の文字を送信することができません。

それではenctype="multipart/form-data"を使えばいいかというと、
残念ながら、現時点でまともなContent-Typeヘッダフィールドを
送信するブラウザがほとんどない(私が知る限り、MacIE5のみ)ため、
結局のところ、自動判別を使うしかないのが現状です。

># DTDを宣言をしてもブラウザいい加減なエンコーディングを送って
># くるのは自由です(ブラウザが古いとか)
># HTML 3.2や2.0がどうなっているか私は覚えていません :)
HTML 3.2や2.0はそもそもISO-8859-1しか使えないので、エンコーディングに
ついては考慮する必要がないのでは。
-- 
太田 秀樹
mailto:hiji@tomeibus.com