Chromeは以下の全ての条件を満たすとき、>>> 勝手 <<<にPOSTデータをHTMLエンコードする。
- HTML中に
<meta charset="UTF-8" />
が設定されていない - formの中身に非ASCII文字が含まれている
- JS(JavaScript)を使わない、素のHTMLのsubmit
この動作はfirefoxでは発生しない。 いくら調べても規格上の動作としての記述が見当たらないから、おそらくChrome独自の仕様。
症状
ChromeでJSを使わないformを記述し、textareaに日本語を入れてボタンからsubmitでPOSTした。 するとサーバーに送られてきた文字列は二重にエンコードされていた。 最初にHTMLエンコードされ、その結果がさらにURLエンコード(パーセントエンコード)されていた。
規格通りの動作なら、HTMLエンコードは無しでURLエンコードだけが行われるはずだ。 サーバーに送られてきたデータをURLデコードして元の文字列が得られない場合は、この問題を疑った方が良いかもしれない。
対策
ちゃんと以下を書いておく。
<meta charset="UTF-8" />
書き捨てるや、簡素なものだからといって省略すると痛い目に遭う。
無意味だったもの
fromのaccept-charsetをUTF-8に変更しても意味が無い。
<form action="/send" method="post" accept-charset="UTF-8">