- PR -

HTMLFormの入力で文字コードはどうやって指定すればいい?

投稿者投稿内容
matobaa
常連さん
会議室デビュー日: 2002/12/26
投稿数: 21
投稿日時: 2004-04-28 21:18
別スレッドからの話題ですが、新規スレッドにしました。Javaとは関係ないですが、いきがかり上、ここに。

HTMLのformからの送信の際のエンコーディングを指定するには、どのような方法があるでしょうか。
一般的なブラウザでは、formを含むページのエンコーディングに従うか、ブラウザの設定によっては UTF-8 を用いてサーバ側に送信する、という動作をするようですが、これってRFCなどで規定されているのでしょうか? それとも、特に仕様化されているものではなくて、そのように実装されているだけなのでしょうか。

もしそのようにブラウザが実装されているだけだとすれば、サーバ側がなんらかの判断方法で判断するしかないですが、送信するときにリクエストヘッダなどにエンコーディング情報を伴っていてくれれば、それに従って取り扱えるはずだ、と思っています。

リクエストを multipart/form-data にして、それぞれのパートで Content-Type: ヘッダの charset で指定する、という方法もあるらしいですが、一般的ではないですよね。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-04-28 21:40
どのエンコーディングで送っているかはブラウザが知っているわけですから、本来はブラウザが
リクエストヘッダにContent-Typeを指定するのが正しい方法でしょうね。

ですが現状ではそうなっていないので、サーバ側では
・エンコーディング決めうちで対処
・送られてきた文字列から自動判別
のどちらかしかないですね。利用者を特定できない場合は決めうちは難しいし、自動判別は
必ず成功するとは限らないので、場合によって使い分けるしかないですね。

RFC的には、Content-Typeは指定するべきだけど指定しない場合は受信側が推測してもよい、
という扱いだったと思います。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-04-30 19:06
エンコードを指定する方法は無いのではないでしょうか。

ページのエンコードと同じようにエンコードして送られると言う実装は、
HTML自体が国際化していなかったころにNetscapeかなにかが始めて、
それが広まっていった系じゃないかと思っています。(根拠無し)

UTF-8でエンコードして送る、というのはある程度根拠があります。
HTML4.01 の仕様の、付属書で
http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/appendix/notes.html#h-B.2
で、とりあえずURLはUTF-8で送ることが推奨されています。
要するにURLにパラメータが付くGETでは、UTF-8で来ることが期待された動作となっています。
POSTでも、フォームのMIMEタイプは標準で
application/x-www-form-urlencode であり、URLのエンコード方法としては
同じやり方をすれば良いわけなので UTF-8 でええやん、と。

と言うことで、現実的な何年も前から続く実装を元にしてページのエンコードで
来ると考えるか、仕様としては根拠のありそうなUTF-8で来ると考えるか、
と言うあたりで悩んでください。
…じゃなくて、ページをUTF-8で出力すればどちらも満たせてOK、と言う考えもあります。

#そうすれば前スレでukさんの書いたようにsetCharacterEncdodingかなにかを使えば
# new String(getBytes("iso-8859-1"),"??????"); をしなくてもOKになるかと思います。

## そうしても「〜」や「−」がOS/ブラウザによって違うコードで来る事の対応は必要。
matobaa
常連さん
会議室デビュー日: 2002/12/26
投稿数: 21
投稿日時: 2004-05-28 02:03
非常に参考になりました。ありがとうございます。
「ページをUTF-8で出力すればどちらも満たせてOK、と言う考えもあります。」
言われてみればそのとおりですね。もうこれで悩むこたぁない。助かりました。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2004-05-28 06:13
<form enctype=[エンコード]>
で送りたいエンコードを指定することができます。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-05-28 10:06
引用:

Anthyhimeさんの書き込み (2004-05-28 06:13) より:
<form enctype=[エンコード]>
で送りたいエンコードを指定することができます。



formのenctypeで指定するものはエンコードではなく「MIMEタイプ」です。

そして、application/x-www-form-urlencoded,multipart/form-data の
場合についてはHTML4.01の仕様にも記載がありますが、その他の場合については
記載が無いため、何を指定した際どのようなデータが送られるのかは
ブラウザ依存としか考えられません。

その「エンコード」に何を指定すればどういうデータが来る、と言うことが
わかるなら、もう少し具体的にお願いします。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-28 10:43
昨日たまたま見つけたのですが、
http://www.hicat.ne.jp/home/tomcre/search/zatu/charset.html
が参考になるかもしれません。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-05-28 18:24
引用:

Wataさんの書き込み (2004-05-28 10:43) より:
昨日たまたま見つけたのですが、
http://www.hicat.ne.jp/home/tomcre/search/zatu/charset.html
が参考になるかもしれません。


JavaScriptであれこれする部分は置いておくとして、多少興味を持った
のはこのあたりです。

「同じページから複数の文字コードを送信する」
引用:

ブラウザが Netscape Navigator(以降ネスケと略す)の場合は form の属性 Accept-charset="****" に符号化方式を指定するだけで良いのです。
(略) :
この当たり前の方法が駄目なのは Internet Explorer(以降IEと略す)です。
試してみましたが Accept-charset="****" での指定はまったく無視されています。
W3C の勧告を守っているのはネスケの方で IE のいい加減さには少々腹が立ってきます。
IE が無視してもサイト製作者の立場からは利用者の多い IE を無視するわけには行かないのです。



興味深いですが、腹を立てるのはやや短絡的かなぁ。

accept-charsetは、「当該フォームを処理するサーバが受け入れる
文字符号化方法のリストを指定する」であって、単一の値だけではなく複数の値を設定可能です。
<form 〜 accept-charset="SHIFT_JIS,EIC-JP,UTF-8">
と有ったら、サーバ側はSJISかEUCかUTF-8かどれかは知らないけど、(このHTMLを吐いた)サーバ側ではこれらで符号化された文字を受け付けますよ、と言うだけの話です。
クライアント側がこれを見てエンコードをこのうちのひとつに合わせなければならない、と言う仕様ではないはずです。

仕様の「ユーザエージェントは、この値を、当該FORM要素を含む文書の伝送に使われた文字符号化方法であるものとしてインタープリトしてよい。 」
と言うのは、ページ自体がShift_JISなのに、「accept-charset="EUC-JP"」が有ったらページ自体がEUC-JPで有ったかのように扱ってもいい。
つまり、ページのエンコードかUTF-8か選ぶ際にページのエンコードを選んだとして、そのエンコードは本当はSJISなのにEUCと解釈して form で送る内容をEUCにしてもよい、と言うことですね。
結局のところ「してもよい」仕様は、しなくてもかまわないわけで、IEが文句をいわれる筋合いは無いとしか思えません。
(むしろaccept-charsetが複数指定された場合にそのうちのどれかでエンコードしても良かったとして、どれを選ぶ? というのが普通は困らないかなぁ)

前スレとこのスレで発言する際、何度もHTML4.01の仕様書を見ていますが、最初に見た際に「このaccept-charsetで指定できるブラウザもあるだろうけど、この仕様ではどう考えてもブラウザ依存だろう」と思いました。

スキルアップ/キャリアアップ(JOB@IT)