PHPで日本語などのマルチバイト文字を扱う際、文字コードを適切に設定しないと文字化けなどのトラブルの原因になります。PHPでは、基本的にphp.iniで文字コードに関する設定を行いますが、ランタイムでもini_set()やmbstringの関数を使用することで設定を変更できます。また、mb_convert_encoding()関数を使うことで明示的に文字コードを変換することもできます。
php.iniでの文字コードの設定
PHPでは、基本的な文字コードに関する設定をphp.iniで行います。下記の例では、内部エンコーディングをUTF-8、出力をShift_JISに設定しています。mbstring.http_outputを指定する場合は、output_handlerにmb_output_handlerを指定します。
php.ini
; 出力のバッファリング
output_buffering = On
; 出力のハンドラー
output_handler = mb_output_handler
; HTTPヘッダのデフォルトエンコーディング
default_charset = Shift_JIS
; デフォルトの言語
mbstring.language = Japanese
; 入力の自動変換
mbstring.encoding_translation = On
; 入力エンコーディング
mbstring.http_input = auto
; 出力エンコーディング
mbstring.http_output = SJIS
; PHPの内部エンコーディング
mbstring.internal_encoding = UTF-8
; 無効な文字の出力
mbstring.substitute_character = none
ランタイムにおける文字コードの設定変更
文字コードの設定は、ランタイムでもini_set()やmbstringの関数を使用することで変更することができます。mbstringの関数は、引数で設定値を渡した場合は値を設定し、引数を省略した場合は現在の設定値を取得します。
PHP
<?php
ini_set('default_charset', 'UTF-8');
echo ini_get('default_charset'), PHP_EOL; // 出力:UTF-8
mb_language('English');
echo mb_language(), PHP_EOL; // 出力:English
mb_http_output('UTF-8');
echo mb_http_output(), PHP_EOL; // 出力:UTF-8
mb_internal_encoding('EUC-JP');
echo mb_internal_encoding(), PHP_EOL; // 出力:EUC-JP
?>
文字コードを変換する mb_convert_encoding()
mb_convert_encoding()を使うと明示的に文字コードを変換することができます。第1引数に文字コードを変換する文字列を指定し、第2引数に変換後の文字コードを指定します。第3引数は変換前の文字コードを指定しますが、省略した場合はinternal_encodingの値が使用されます。
PHP
<?php
mb_internal_encoding('UTF-8');
$str = 'あいうえお';
// UTF-8からShift_JISに変換
$sjis = mb_convert_encoding($str, 'SJIS', 'UTF-8');
// 内部エンコーディングからEUC-JPに変換
$euc = mb_convert_encoding($str, 'EUC-JP');
?>