web-dev-qa-db-ja.com

HTTP POSTリクエストの文字エンコーディングの検出

私はWebサービスを構築していて、POSTを受け入れて新しいリソースを作成するノードを持っています。リソースは、2つのコンテンツタイプの1つ、つまり定義するXML形式を想定しています。フォームでエンコードされた変数。

アイデアは、消費するアプリケーションがPOST XMLに直接アクセスし、より良い検証などの恩恵を受けることができるということです。しかし、POST XML形式には明らかにcharset宣言がありますが、POSTを見ただけではフォームのcharsetをどのように検出するかわかりません。

Firefoxからのフォームへの典型的な投稿は次のようになります。

POST /path HTTP/1.1
Host: www.myhostname.com
User-Agent: Mozilla/5.0 [...etc...]
Accept: text/html,application/xhtml+xml, [...etc...]
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 41

field1=value1&field2=value2&field3=value3

文字セットの有用な表示が含まれていないようです。

私が見ることができるから、application/x-www-form-urlencodedタイプはHTMLで完全に定義されており、これは%-encodingルールをレイアウトしているだけですが、データがどの文字セットにあるべきかについては何も言いません。

基本的に、元々提示されていたHTMLの文字セットがわからない場合に、文字セットに伝える方法はありますか?それ以外の場合は、存在する文字に基づいて文字セットを試して推測する必要がありますが、それは私が伝えることができるものから常に少し曖昧です。

50
Ciaran McNulty

hTTP POSTのデフォルトのエンコーディングはISO-8859-1です。

それ以外の場合は、次のように見えるContent-Typeヘッダーを確認する必要があります

Content-Type: application/x-www-form-urlencoded ; charset=UTF-8

おそらくフォームを宣言することができます

<form enctype="application/x-www-form-urlencoded;charset=UTF-8">

または

<form accept-charset="UTF-8">

エンコードを強制します。

いくつかの参照:

http://www.htmlhelp.com/reference/html40/forms/form.html

http://www.w3schools.com/tags/tag_form.asp

62
chburd

POSTで使用される文字セットは、フォームをホストするHTMLで指定される文字セットの文字セットと一致します。したがって、投稿コンテンツに使用されるエンコーディングであるUTF-8エンコーディングを使用してフォームが送信される場合、 URLエンコーディングは、値が文字エンコーディングのオクテットセットに変換された後に適用されます。

11
AnthonyWJones

Content-Typeに文字セットを設定してみてください。

httpCon.setRequestProperty( "Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary );
1
ZeroConcept