ラボ > PHP:文字関連

PHP 文字コードの確認(mb_detect_encoding())

以前調べたとき、見つけられなかったけど簡単に確認することができるっぽい。

作成日:2018-02-22, 更新日:2018-02-22

基本

$str = 〇〇〇;
$charCode = mb_detect_encoding($str);

検出失敗で「false」が返ってくるそうだ。

エンコーディング検出の順番指定

$str = 〇〇〇;
$charArys = array('UTF-8', 'eucJP-win', 'SJIS-win', 'ASCII', 'EUC-JP', 'SJIS', 'JIS');
$charCode = mb_detect_encoding($str, $charArys);

厳格にチェック

$str = 〇〇〇;
$charArys = array('UTF-8', 'eucJP-win', 'SJIS-win', 'ASCII', 'EUC-JP', 'SJIS', 'JIS');
$charCode = mb_detect_encoding($str, $charArys, true);

※第3引数指定。

めも

PHP4から使えるとある。
以前調べたときは「そんな便利な関数は無い!」とあって、調べたいなら調べたい文字コードで変換して、前後で同じかチェック・・・ってヤツだった。

参照:php 文字コードの調査と変換(mb_convert_encoding())

変換前の文字列と変換後の文字列の何かが違うソースがあった

上記の「php 文字コードの調査と変換(mb_convert_encoding())」で検出できないソースがあった。

変換前の文字列と変換後の文字列を出力してdiffをとっても同じ。でもif文の中に入ってくれない。
「微妙な文字コードが隠れているのか?」と思い、「UTF8だしBOM絡み?」と思って調べてもBOMは関係なかった。
他に何かあるかもしれないけど、原因不明

「mb_detect_encoding()」だと「UTF8」が返ってくるけど、厳格にチェックをすると「false」が返ってくる。

結局分からないけど・・・「mb_detect_encoding()」で解決したからひとまず放置。

BOMチェック

UTF8のBOMチェックは下記のような感じ

if (preg_match('/^[\x0x\xef][\x0x\xbb][\x0x\xbf]/', $str)) {
   // BOMあり
   
   // BOM削除
   // $str = substr($str, 3);
}
else {
   // BOM無し
}

関連項目

php 文字コードの調査と変換(mb_convert_encoding())

参考

PHPの公式:mb_detect_encoding()