作成日: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())