ソースEUC-JP・出力SJISのサンプルをUTF-8に統一
文字コード等設定変更サンプル
教本の執筆時期によって、実際の最新バージョンのツールのデフォルト設定や主流とずれが生じ文字化けを起こす場合があります。ここでは、参考までに、「速攻!図解プログラミング PHP+MySQL ハーシー著」での文字コード設定を、UTF8に統一させて読み進める場合の変更点を紹介します。
PHPの設定(Section05)
- output_handler
- 設定しない(;output_handler= のままとしておく)
出力バッファ文字を、内部文字エンコーディングからHTTP出力文字コードに変換する場合の設定で文字コード統一する場合不要。 - default_charset
- "Shift_JISを、""utf-8"に。
出力時にHTTPヘッダとして送信する文字コードの設定。スクリプト内記述のheader ("Content-Type: text/html; charset=UTF-8"); と同じであり、Content-Typeが固定されることに注意。 - extension_dir
- phpを設置したディレクトリに応じて 設定。
(xampp利用の場合は、自動で設定されている。) - mbstring.language
- mb_send_mail関数(文字コード変換指定不可)利用時の言語設定。使わない場合は設定不要であるが、Japaneseに設定しておく。
- internal_encording
- EUC-JPを、UTF-8に。
mbstring関数のデフォルトエンコードのことで、ソースで指定されていない場合に認識される。※ソースの文字コードもUTF-8に。 - http_output
- SJISを、passに。
mb_output_handlerが実行された時の出力エンコード。outoput_handlerで設定していないのでここでも指定しない。 - encoding_translation
- Onを、Offに。
HTTP入力文字コードの検出と、内部文字コードへの自動変換設定。サーバー設定異なる場合等に支障が生じるのでここでは無効に。 - detect_order
- autoを、UTF-8,SJIS,EUC-JP,JIS,ASIIに。
文字コードの自動検出の優先順位の指定。autoではASCII,JIS,UTF-8,EUC-JP,SJISの順となるが、ASCIIが最初でない順に指定。
エラーの確認(Section08)
php_flag display_errors "On"に併せて、エラー表示レベルも下のように設定。
- エラー表示レベル設定
- php_value error_reporting 2047
なお、2047は、非推奨関数使用時以外の全てのエラーを表示する設定。その他の設定は、他のマニュアルを参照して下さい。
文字列バイト数・文字数の取得関数の利用(Section26)
$str = "こんにちは!";
$length = strlen($str);
$mb_length = mb_strlen($str,'utf8');
- strlen関数
- バイト数を取得する関数ですが、日本語1文字のバイト数は、
文字コードEUC-JPの場合は概ね2バイトで$lengthは12となるが、
UTF-8では概ね3バイトのため、$lengthは18となる。 - mb_strlen関数
- mb_strlen($str);のように、文字コード省略してもよいが
(省略時は、PHP設定ファイルのinternal_encodingで指定に)、
mb_strlen($str,'文字コード');のように指定した方がよい。
文字コード変換関数の利用(Section29)
テキストでは、EUCで保存したファイルをブラウザ上でSJISで表示させるために、mb_convert_encording関数を利用していますが、両方をUTF8などに統一させている場合は、この記述は不要です。
メール送信設定(Section31)・メール受信(Section46)
mb_send_mail関数を用いる場合、php.iniまたは.htacceccまたはスクリプト内で設定する、mb_send_mail言語設定(mbstring.language)をJapaneseと設定し、mbstringのデフォルト(internal_encoding)設定とファイルの文字コードを揃えておく必要があります。(参照:文字コード等のPHP設定)
なお、SMTPの設定が、テキストではlocalhostとなっていますが、実際に稼働しているメールサーバーの設定を記述しないと動作しません。契約しているメールサーバーの設定がわかる場合は、書き換えてみましょう。
データベースMySQLのテーブル作成(Section58)
データベースの中にデータを入れ込むための枠組み(テーブル)を作成する際に、CREATE TABLE テーブル名(項目名1 型設定1, 項目名2 型設定2);といった記述をしますが、文字化けが生じる場合は、最後のかっこ)とコロン;の代わりに、)CHARACTER SET utf8 COLLATE utf8_unicode_ci; SET NAMES utf8;というように文字コードの設定をしてみましょう。
データベースMySQLでのデータ挿入(Section65)
テキストでは、PHPファイルの文字コードをEUCJPとし、MySQLの保存文字コードをSJISに設定しているため、mb_convert_encording関数でWindowsの場合は変換する記述を入れていますが、UTF8で揃えている場合はこの記述は不要で、代わりにデータベース接続の記述の後に、下記記述を加えましょう。
$sql = " SET NAMES utf8 ";
$result = $conn->query($sql);
