2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

PHPスクリプトでの日本語文字化け対策用php.iniの記述!

元々この文面を書いたのは、FreeのIntraスクリプト La!cooda WIZ を使っていて、ファイル共有と言う機能の共有ファイルのダウンロードを行おうとしたときに日本語ファイル名のみ文字化けした現象の対策を行ったのでそのメモである。

OS : VineLinux3.2 Kernel2.4.22
La!coodaWIZのバージョン : 1.1.3
HTTPサービス : Apache2.0.50
PHPバージョン : 4.3.4
Postgresqlバージョン : 7.4.3


1.PHPでの日本語文字化けの問題
BlogやLa!coodaWIZのようなスクリプトの場合、2バイト文字の扱いが非常に問題となる。PHPでは昔から日本語の扱いで議論が続いてきた。今回俺がぶつかった問題は、La!coodaWIZのファイル共有と言う機能を使うときに発生する問題で、さらにブラウザFirefoxを使った場合のみに発生するという、厄介な問題である。
このときの各部分のCharは以下のようになっている。

■VineLinux自体のlocaleは、EUC-JP
■La!coodaWIZのPHPからHTML出力時のcharset定義は、EUC-JP

これは参考までだが、ブラウザのことを考えると、もしContent-type定義でCharsetを指定しなかった場合、IEで受け付けられるのは、Shift-JISのファイル名のみで、Firefoxでは、UTF-8のときまともにエンコードするようだ。ただし、悲しいかなHTML中のCharsetとファイル名の文字化けとは何ら関係は無い気がする。
まあ、常識としてContent-type定義のCharsetは必ず指定しましょう。と言う学習は出来る。とにかく、IEとFirefoxではデフォルトでエンコードを得意とするCharが違うということが原因だろう。


2.php.iniの設定を見直す
色々考えたあげく、php.iniファイルを見直してPHP自体のstrings環境を設定してみた。

以降、今回文字化けを回避できたphp.iniの設定内容(訂正が必要な部分のみ)
個人的な意見だが、これが結構PHPで日本語を扱う場合に理想的な設定に近いもののような気がしてる。

magic_quotes_gpc = Off
セキュリティを考えるには都合が良いオプション。シングルクォートなどの文字をエスケープしくれるので、SQLインジェクション攻撃等の対策技となる。ただし、これを有効(On)にすると、SJISを使用した時、例えば「ソ」や「示」の文字を入力した場合に「\」が追加されるため文字化けを引きおこすので注意が必要だ。この機能は、文字コードを見てエスケープを行うためだ。デフォルトではONだが、文字コードに関するトラブルを防ぐためならばOffにした方が良いかもしれない。

output_buffering = On
これを、有効にすると全てのファイルのための出力バッファリング機能が使える。

output_handler = mb_output_handler
文字エンコーディングは透過的に指定したエンコードへ変換される。また、出力ハンドラを指定することにより自動的に出力バッファリングを on にする。

default_charset = Shift_JIS
PHP4系になってから、デフォルトで常にHTMLのContent-type:ヘッダでキャラクタエンコードを出力するようになっている。これを無効にするには、””(NULL)をセットする。

mbstring.language = Japanese
mbstringで使用される言語のデフォルト値。この設定は次のmbstring.internal_encodingを定義するために必要なセクション。ただし、mbstring.internal_encodingは、このmbstring.languageの後で記述するので注意すること。

mbstring.internal_encoding = EUC-JP
内部文字エンコーディングのデフォルト値を定義する。

mbstring.http_input = auto
HTTP入力文字エンコーディングのデフォルト値を定義する。

mbstring.http_output = SJIS
HTTP出力文字エンコーディングのデフォルト値を定義する。

mbstring.encoding_translation = On
入力されるHTTPクエリに対して、文字エンコーディング検出および内部文字エンコーディング変換を行う透過的な文字エンコーディングフィルタの有効/無効。

mbstring.detect_order = auto
文字コード検出のデフォルト値を定義する。

mbstring.substitute_character = none
無効な文字を代替する文字を定義する。

以上

コメント