dullwhaleのメモ帳

何度も同じことを調べなくてよいように...

ChromeだけPOSTしたデータが勝手にHTMLエンコードされる

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">