アットウィキロゴ

PHPの文字化けを本気で解決する

というサイトに文字化けに対するセッティングの面白いことがかかれていた。

default_charset を無効にするという方法が書かれていた。

なるほど、逆の発想で、自動でエンコードをすることをやめればいいということです。
自動でエンコードをするということは、
自動変換とはhttp_input、http_outputの様なフィルター系や、
default_charsetの様な付加系(?)のようなもの。
これらを利用しないことが重要なのである。

default_charset を設定するということは

default_mimetype = 'text/html'で
default_charset = 'utf-8'の場合
header('Content-Type: text/html; charset:utf-8');
これが設定されるということ




とある。

しかし、これは同時に

GETやPOSTのデータも一つ一つ変換しなければならないことになる。

ということです。

php.ini の設定は

    ;; Disable Output Buffering
    output_buffering = Off

    ;; Set HTTP header charset
    ; default_charset = EUC-JP

    ;; Set default language to Japanese
    mbstring.language = Japanese

    ;; HTTP input encoding translation is enabled.
    mbstring.encoding_translation = off

    ;; Set HTTP input encoding conversion to auto
    mbstring.http_input = pass

    ;; Convert HTTP output to EUC-JP
    mbstring.http_output = pass

    ;; Set internal encoding to EUC-JP
    mbstring.internal_encoding = EUC-JP

    ;; Do not print invalid characters
    mbstring.substitute_character = none

    mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII

こうすれば、無変換になるとのこと・・・。

●internal_encodingは内部エンコードのことではない
先ほどの例の時にも書いたが、
PHPには内部エンコードという概念は存在しない。
ではmbstring.internal_encodingとは何なのか。
これは

mbstring関数のデフォルトエンコード

なだけである。
mb_convert_kanaなどのパラメータで、
変換元文字コードの指定がなかった時にだけ利用されるものだ。

んん~。ほんまかいなぁ~という感じ・・・。文字からだけでは想像できない。やはり内部の事情を知っていないと扱えないことがわかるなぁ~。


これらを見ているとなるほど、、、。目からうろこという感じ・・・。GETやPOSTを文字セットしなければならないということは、手間がかかるが、データベースを扱っていると文字化けは深刻な問題となる。
文字化けした値を渡せば検索しないということになるのです。だからめんどうくさくても、ここのサイトでいっているように自動変換系を全てOFFにしてしまい、プログラム側で設定してしまうというのは、一番確実な方法なのかもわかりません。

データベースに値を渡す場合もデータベースで扱っている文字コードに変換し、値を渡せばいいのだと思います。

私の場合、Webアプリケーションで xampp をインストールしているだけで、ローカルなアプリケーションですから、全てを SJIS にして、文字化けを起こさないようにすれば間違いないということになります。

タグ:

+ タグ編集
  • タグ:
最終更新:2008年09月01日 12:02