PHPを使っている上で避けられない問題です。
過去の記事を見てもらえればわかりますが、僕も中途半端な知識で戦っていました。しかし、戦うことによっていろいろとわかってきました。
まず前の記事についての訂正です。
前の記事でmbstring.http_inputとmbstring.http_outputを設定すると自動的に文字コードが変換されると書きましたが、うそです。
mbstring.http_input
『HTTP 入力文字エンコーディングのデフォルト値を定義します。』
HTTPの入力文字、つまりGETやPOSTで飛んでくる文字の文字エンコードのデフォルトを定義するそうです。
mbsrting.http_output
『HTTP 出力文字エンコーディングのデフォルト値を定義します。』
mbstring.internal_encoding
『内部文字エンコーディングのデフォルト値を定義します』
内部エンコーディング?これは明らかに混乱を招きますよね。。
内部エンコーディングって表現よりも、mbstring(日本語を扱う時)の文字エンコードの指定です。基本的にはEUC-JPが一般的だと思います。
mbstring.encoding_translation
『入力される HTTP クエリに関して、 文字エンコーディング検出および内部文字エンコーディングへの変換を行う 透過的な文字エンコーディングフィルタを有効にします。』
ようはPOSTやGETで飛んできた文字の文字コードを変換するのです。
この4つの設定をしっかりして初めて自動的に変換してくれるのです。やはりこの辺はPHPを使う者として仕組みを理解しておかなければ。
(たとえばhtmlの文字コードがSJISのフォームをPHPで処理をしなければならない場合)
文字コードの変換の流れ
①POSTやGETでフォームされてきたデータのmbstring.http_inputで指定した文字コードとしてPHPが認識
②mbstring.encoding_translation がmbstring.http_inputで指定した文字コードからmbstring.internal_encodingで指定した文字コードに変換する。
③そしてPHPが処理をする。
④処理後ブラウザなどで文字列を表示する際にmbstring.encoding_translationがmbsrting.http_outputで指定した文字コードに変換。
このことによりmbstring.http_inputとmbsrting.http_outputをSJISにすることにより、文字コードがSJISで書かれたHTMLをEUCの文字コードとしてPHPで処理ができるようになる。
またHTMLのソース部分自体をEUCの文字コードのPHPファイルとして書いても文字化けがなくなる。
この仕組みをしらないと苦労することになります。