アーカイブ
PHPと日本語
PHPで日本語を利用する際のphp.iniの設定やはまりごとなど。
■導入時
○必須オプション
–enable-mbstring
マルチバイト文字列関数(mb_〜)を利用できるようになります。
これがないと話になりません。
○推奨オプション
–enable-zend-multibyte
このオプションはスクリプトをShift_JISで記述する場合問題となる2バイト目が0×5C等に成りうることによる問題を回避できます。
echo "Oh!能";
本家で取得できるWindowsバイナリはこちらのオプションを利用していませんので気をつけてください。
■mbstringで設定できるエンコード名
利用できるなら(ほぼできると思いますが)SJIS-win、eucJP-winを利用しましょう。
DoCoMo絵文字、①も相互変換、利用できるようになります。
$str = '①'; $str = mb_convert_encoding($str, 'SJIS-win', 'UTF-8'); $str = mb_convert_encoding($str, 'UTF-8', 'SJIS-win'); echo $str; // ①
■php.iniの設定
○mbstring.language
mbstring.internal_encodingを設定する上で必須なので設定しましょう。
○mbstring.internal_encoding
よく内部エンコーディングといわれますが、あくまで、マルチバイト文字列関数を利用する場合のデフォルトエンコーディングです。
スクリプトファイルと同じエンコーディングを指定すれば、mb_strlen等の関数を利用する場合引数を省略できます。
○mbstring.http_output
HTTP出力文字エンコーディングのデフォルト値です。
単体では意味がありません。
「output_handler = mb_output_handler」も同時に指定することで初めて、出力の際にmbstring.internal_encoding
からmbstring.http_outputへエンコーディングの変換を行います。
利用する場合はdefault_charsetも設定しておくとよいでしょう。
output_handler = mb_output_handler default_charset = Shift_JIS mbstring.internal_encoding = UTF-8 mbstring.http_output = SJIS
○mbstring.http_input
HTTP入力文字エンコーディングのデフォルト値です。
単体では意味がありません。
「mbstring.encoding_translation = On」も同時に指定することで初めて、入力をmbstring.http_inputからmbstring.internal_encodingへエンコーディングの変換を行います。
○mbstring.detect_order
文字コード検出のデフォルト値です。
利用するエンコーディングを指定するだけしておいたほうがいいです。
結論として、「mbstring.language」、「mbstring.internal_encoding」、「mbstring.detect_order」だけ設定し他はデフォルトでいいのではないでしょうか。
自分の場合こんな感じになってます。
mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.encoding_translation = Off mbstring.http_input = pass mbstring.http_output = pass mbstring.detect_order = UTF-8,SJIS-win,eucJP-win mbstring.substitute_character = none
携帯オンリー
default_charset = Shift_JIS mbstring.language = Japanese mbstring.internal_encoding = SJIS-win mbstring.encoding_translation = Off mbstring.http_input = pass mbstring.http_output = pass mbstring.detect_order = SJIS-win,UTF-8 mbstring.substitute_character = none
■利用時の注意
○mb_regex_encoding
スクリプト内においてinternal_encodingを変更時、mb_internal_encording()を利用した場合はマルチバイト正規表現を利用する場合は別途mb_regex_encoding()を呼ぶ必要がある。
echo ini_get('mbstring.internal_encoding'); // UTF-8
mb_internal_encoding('SJIS-win');
echo mb_regex_encoding(); // UTF-8
echo mb_internal_encoding(); // SJIS-win
echo ini_get('mbstring.internal_encoding'); // UTF-8
ini_set('mbstring.internal_encoding', 'SJIS-win');
echo mb_regex_encoding(); // SJIS
echo mb_internal_encoding(); // SJIS-win
マルチバイト文字列関数以外はinternal_encodingの値を参照なんてもちろんしないことに注意。
○htmlspecialchars
mbstringのエンコーディングと違うのでSJIS-winを指定できないことに注意。
//echo htmlspecialchars('<>\'"', ENT_QUOTES, 'SJIS-win');
echo htmlspecialchars('<>\'"', ENT_QUOTES, 'SJIS');
○preg系
uオプションを利用すればUTF-8で利用できます。
preg_match('/テスト/u', 'テスト');
○mysql_real_escape_string
mysql_client_encoding()のエンコーディングに依存。
mysql_client_encodingで取得できる値は変更できないため、たとえば、mysqlのエンコーディングをcp932で利用しPHP4デフォルトのクライアントを利用している場合、文字コードが見つからず(警告がでる)latain1がセットされるため5c文字をしっかりエスケープしようとし想定外の結果となる。