mb_detect_encodingの罠

July 22 [Tue], 2008, 20:24
こんにちは
iPhone欲しさに今更ながら表参道にならべば良かったと
後悔している山科です。

日ごろPHPで開発をしているのですが
この前引っかかって無駄に時間を費やしてしまったことについて
書きます。

内容としては
mb_detect_encodingという文字列のエンコードを調べる
PHPの関数についてです。
百聞は一見にしかずということで以下にサンプルと実行結果を
記載しました。

-------------------------------------------------------------
コード :
$str1 = "任天堂";
$str2 = "日本語";

echo $str1 . "のエンコードは" . mb_detect_encoding($str1) . "です\n";
echo $str2 . "のエンコードは" . mb_detect_encoding($str2) . "です\n";
?>

結果 :
任天堂のエンコードはUTF-8です
日本語のエンコードはEUC-JPです
------------------------------------------------------------------

環境はEUC-JPで実行したのですが
上記のように文字によって判定が違います。
これはPHPのmbstringのdetect_orderがautoになっていること
によって起こります。
autoに設定するとPHPが以下の順番で文字コード判定を行い
合致した時点でその文字コードを判定しているためです。
[ASCII, JIS, UTF-8, EUC-JP, SJIS]

解消するためには
・mbstringのdetect_orderの順番をEUC-JPを前に設定する
・mb_detect_orderの第二引数にdetect_orderの順番を指定する

今回は環境をいじれなかったため後者の方法で解決しました。
-------------------------------------------------------------
コード :
$str1 = "任天堂";
$str2 = "日本語";

echo $str1 . "のエンコードは" . mb_detect_encoding($str1, array("EUC-JP", "UTF-8")) . "です\n";
echo $str2 . "のエンコードは" . mb_detect_encoding($str2, array("EUC-JP", "UTF-8")) . "です\n";
?>

結果 :
任天堂のエンコードはEUC-JPです
日本語のエンコードはEUC-JPです
------------------------------------------------------------------

日本語の文字コードはいつもながら苦労しますが
こんなオチもPHPを扱っていく上では理解していかなきゃいけないのか、、、
と一つ勉強になった出来事でした。
  • URL:http://yaplog.jp/gmodev/archive/21
Comment
小文字 太字 斜体 下線 取り消し線 左寄せ 中央揃え 右寄せ テキストカラー リンク 絵文字 プレビューON/OFF
画像認証  [画像変更]
画像の文字 : 
利用規約に同意
 X 
禁止事項とご注意
※本名・メールアドレス・住所・電話番号など、個人が特定できる情報の入力は行わないでください。
「ヤプログ!利用規約 第9条 禁止事項」に該当するコメントは禁止します。
「ヤプログ!利用規約」に同意の上、コメントを送信してください。
プロフィール
  • ニックネーム:GMOメディア開発部の面々
  • 性別:男性
  • 職業:専門職
読者になる
Java、PHP、Ruby、Scala、iPhoneアプリ、Androidアプリなどを開発しています。何かご質問があれば、どうぞ!
2008年07月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
最新コメント