polidog lab

Top About Rss
2007年03月17日

文字コードとの戦い

PHPを使っている上で避けられない問題です。
過去の記事を見てもらえればわかりますが、僕も中途半端な知識で戦っていました。しかし、戦うことによっていろいろとわかってきました。

まず前の記事についての訂正です。
前の記事でmbstring.http_inputmbstring.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ファイルとして書いても文字化けがなくなる。

この仕組みをしらないと苦労することになります。

comments powered by Disqus