サーバが違うとPHPの初期設定も違うので(同じにして欲しいものだが…)同じプログラムでも文字化けを起こす。
mbstringの設定をしないといけない。
主な設定項目として
(参考ページ:http://manual.xwd.jp/ref.mbstring.html)
※以前はPHPマニュアルにもこの記述が載っていたのだが、一新されてから分からなくなった。
mbstring.detect_order:文字エンコーディングの検出順序(no value)
mbstring.encoding_translation:入力されるHTTPクエリに関して内部エンコーディングへの変換を行うか?(Off)
mbstring.func_overload:シングルバイト対応の関数をmbstring関数の対応する関数でオーバーロードするか?(0)
mbstring.http_input:HTTP入力文字のエンコーディング(pass)
mbstring.http_output:HTTP出力文字のエンコーディング(pass)
mbstring.internal_encoding:内部文字のエンコーディング(no value)
mbstring.language:mbstringで使用する言語(neutral)
mbstring.substitute_character:無効な文字を代替する文字(no value)
()内はウチのサーバの設定内容
この設定だと、言語設定を日本語にすれば、問題なく動作します。
日本語の設定
mb_language('Japanese');
UTF-8でコードを書けば、入力文字もUTF-8、出力文字もUTF-8です。携帯サイトはSJISで書くので、それはSmartyのテンプレートをSJISで書いて、表示文字だけUTF-8からSJISに変換するだけでOK。
それでも、他のサーバでも同じように動かすために、最初にmbstringの設定をしてしまう。
mb_language('Japanese');
ini_set('mbstring.detect_order', 'auto');
ini_set('mbstring.encoding_translation',0);
ini_set('mbstring.http_input' , 'auto');
ini_set('mbstring.http_output' , 'pass');
ini_set('mbstring.internal_encoding', 'UTF-8');
ini_set('mbstring.script_encoding' , 'UTF-8');
ini_set('mbstring.substitute_character', 'none');
最近使った、ラビットサイトは、内部エンコーディングと出力文字のエンコーディングがEUC-JPです。
HTMLもPHPもDBも全てEUC-JPなら問題なしですが、UTF-8だと、文字が化け化けです。
この場合、上記の設定をPHPから行っても、どういうわけか、encoding_translationが1のまま(入力文字を内部エンコードに変換)でした。.httaccessでPHPの設定を行ったが、これも効かず。
幸いにして、php.iniの変更が可能だったので、全ての設定をphp.iniで行った。
変更内容は、
mbstring.language = Japanese
mbstring.encoding_translation = On
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.internal_encoding = EUC-JP
mbstring.detect_order = auto
mbstring.substitute_character = none;
を
mbstring.language = Japanese
mbstring.encoding_translation = Off
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.internal_encoding = UTF-8
mbstring.detect_order = auto
mbstring.substitute_character = none;
に。

コメントする