先日、PHPプログラミングしていて困ったことがあったのでシェアします。
[ads1]
フォームでデータを取り扱う必要があった
とある案件で、一つのフォームでファイルと文字の両方を送信せねばならない状態で、普段私が使っているようなデータを扱うときだけ別窓で送信させるという手法も使えない状態でした。そのとき、何のことはなくenctype = “multipart/form-data”と属性を設定したformでPOSTさせたところ、文字化けが起こってしまったのです。
ただの文字化けかと思っていたが・・・
mb_detect_encoding でエンコードを確認するとUTF-8。文字化けしたと思っていたが実は文字化けしていない、いやでもしかし文字化け・・・?という奇妙な状態。再エンコードを掛けて見るも、どれもうまくいかず。なぜかとしばらく悩んでいたが、文字化けした文字をASCIIで出させてやっと原因がわかった。
犯人は、HTML_ENTITIES
実は、enctype=”multipart/form-data”としたときは、文字がエンコードされずに送信されるわけですが、そのときはマルチバイト文字はどうやって表現されているのでしょうか。そう、HTML_ENTITIESです。HTML_ENTITIESはHTMLで特殊文字などを表示させるときに使う文字参照だと思っていたのですが、どうやら日本語などマルチバイト文字はこの場合文字参照の状態で送信されてしまうようです。しかもそれがPHP側ではUTF-8として認識してしまうわけだから何のエラーも出ず文字化けしてしまうわけ。
PHPでは対処が簡単
幸いにも、PHPでこの問題に出会ってしまったときには簡単に対応できます。私の場合は次の対処法をおすすめしています。
string mb_convert_encoding ( string
$str
, string$to_encoding
[, mixed$from_encoding
= mb_internal_encoding() ] )
詳しい説明はリファレンスをご覧頂くとして、from encodingにHTML_ENTITIESを指定するだけで簡単に望みの文字コードに変換することが出来ます。