![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
PHPの文字化けについて2005/09/30変更
PHPを使っていると設定の不備、コーディングの問題などで日本語が文字化けすることがあります。これで困っている人が多いようですので別途にまとめました。 以下の説明は私が過去に経験したことをまとめましたが、すべての条件について書いているわけではありません。もしも、これら以外で文字化けしている人がおられましたら、是非、掲示板などでお知らせください。 php.iniの設定ミスまず、確認のため、php.iniで文字化けに絡む部分をピックアップしておきます。もう一度、設定値を確認してください。ここではPHP4.3.xについて書いてます。
設定内容の確認のため、以下のスクリプトを保存してブラウザで表示してみてください。「mbstring」セクションの「Master Value」の値がphp.iniの設定値と同じになっているか確認してください。私はコメントを外すのを忘れていて、ちゃんと設定されてないことがありました。
ここまで大丈夫なら、次のスクリプトを実行してみます。テストする文字列は「ソリューション表示」がいいかと思います。この文字列は文字化けしやすいです。
このスクリプトの実行結果が「入力した文字列は『ソリューション表示』ですよね?」と表示されるようなら、php.iniの設定は間違っていません。
php.iniの設定値と、実際のスクリプトとの食い違いphp.iniの「mbstring.internal_encoding = 」の設定と、実際に保存してするスクリプトの文字コードの不一致によって文字化けします。 「mbstring.internal_encoding = EUC-JP」にしているなら、スクリプト・ファイルはEUCで保存してください。 「mbstring.internal_encoding = SJIS」にしているなら、スクリプト・ファイルはシフトJISで保存してください。 Windowsでスクリプトを作っていると間違えやすいです。 httpd.confの問題掲示板で教えていただいた情報では、Redhat9にPHPをインストールすると文字化けすることがあるようです。 回避方法は2つあります。
なお、掲示板情報から以下も追加設定するとFedoraなどでの文字化けが解消するそうです(これは私は未確認です)。
日本語を含む文字列に文字列関数を使う場合うちの掲示板で、指摘がありましたので、ここに書いておきます。 日本語を含む文字列が代入された変数に、文字列関数を使う場合、先頭にmb_が付いた関数を使うようにしましょう。 普通の文字列関数を利用するとバイト単位で動作するので、文字化けする可能性があります。 あえてバイト別に処理したいようなときは、mb_()関数ではうまくいきませんので、普通の文字列操作関数を使うことになると思います。 文字列変数を出力するときの注意echoなどで文字列を出力するとき、'<', '>', '&' などが文字列に含まれている時、ブラウザがHTMLタグと勘違いするので文字化けしたり、ページ自体がおかしな表示になります。
このようにして htmlspecialchars を使って表示するようにします。特にフォームやデータベースから取得するデータでは、このような文字化けが頻繁におきますので注意が必要です。 PHPスクリプト内部で出力文字コードを指定したい場合文字化けとは直接関係ありませんが、掲示板で「特定のページのみ出力文字コードを変えたい」というお話がありました。.htaccessで変えてもいいのですが、スクリプトによって動的に出力文字コードを変えたいこともあるかと思いますし、この関係で文字化けする場合もあるようですからここにメモを書いておきます。 PHP4よりob_start()関数が追加されました。これはphp.iniの設定値output_bufferingのかわりになるような感じなんです。 このことから、ob_start()を使うとoutput_bufferingとoutput_handlerを動的に変えることができるようです。 以下の例では、internal_encodingがEUC-JPで、php.iniや.htaccessではSHISかEUC-JPに設定してあるにもかかわらず、UTF-8でブラウザ出力するようにスクリプトを作った例です。
ブラウザの問題たとえば、ブラウザへの出力をEUCにしているのにフォームからの入力結果がシフトJISで送られてくるような場合(または、この逆の場合)です。 この場合でも「mbstring.http_input=auto」にしていれば、たいていの場合、PHPが自動判別して入力結果を internal_encoding の文字コードに変換してくれます。 しかし、この自動判別に失敗することがまれにあります。短い2バイト文字列を入力したような場合に判別ミスをすることがあるようです。 したがって、漢字を入力するフォームでは以下のようにダミーで送信するようにすると、この判別ミスがなくなります。
データベースを利用する場合の注意データベースを利用する場合、internal_encoding の設定値とデータベースの文字コードが違っていると、データベースとのI/Oのたびにスクリプトで文字コードを変換する必要があります。これは、実際にやってみると非常に面倒です。したがって、データベースを利用する場合は、できるなら internal_encoding の設定値とデータベースの文字コードを合致させるようにしましょう。
たとえば、MySQLを利用する場合なら「default-character-set=sjis」としたら「mbstring.internal_encoding = SJIS」とします。
「default-character-set=ujis」としたら「mbstring.internal_encoding = EUC-JP」とします。
話は変わりますが、SQL文を動的に生成するとき、addslashes関数を利用するようにしましょう。
このスクリプトでは、フィールドが\1280のレコードをセレクトしているように見えますが、正しく動作しません。
この場合は、フィールドが\1280のレコードがセレクトされます。
なお、MySQLではaddslashesの代わりにmysql_escape_stringを使うほうがより良いと思います。 |
| Copyright©2001-2008 釣ったよ! All Right Reserved. sg@tsuttayo.sytes.net |