mb_check_encoding() の内部処理

参考までに、mb_check_encoding() が内部で何をしているかについて書いておきます。
mb_check_encoding() は mb_convert_encoding() で第2引数と第3引数に同じ文字コードを指定した場合と同じ処理い、元の文字列と、変換後の文字列が同じかどうかで TRUE/FALSE の判定を行います。
mb_convert_encoding() の内部では、変換時にユニコード文字列に変換することがあり、元の文字コードに戻した時に元の文字列と違うことがあります。このため、mb_check_encoding() では、TRUE を返す必要がある文字列で FALSE を返すことがあります。

実際には、以下の2つは同等の結果になります(PHP 5.2.0 以降、正確には PHP 5.2.7 以降)。

<?php
$result = $str === mb_convert_encoding( $str, 'SJIS', 'SJIS' ); //1
$result = mb_check_encoding( $str, 'SJIS' );                  //2

mb_check_encoding() は以下のように、多くの注意事項があります。

  • PHP 5.3.0 では UTF-8 の取扱いが厳しくなっている(サロゲートペアに相当する領域は FALSE を返すようになった)ただし、PHP 5.2.x は対象外
  • PHP 5.2.9 で SJIS および、SJIS-win で一部の不正な文字列が TRUE になる問題が修正されている
  • PHP 5.2.7 より前のバージョンでは、$str に NULL バイトが含まれている場合、不正な文字列でも mb_check_encoding() が TRUE を返すことがある
  • PHP 4.4.3 - 4.4.4、PHP 5.1.3 - 5.2.0 では、UTF-8 の判定で常に TRUE を返すという問題がある
  • PHP 4.4.2 以前、PHP 5.1.2 以前のバージョンには mb_check_encoding() は実装されていない
  • PHP 5.2.1 では、文字コード変換に一部修正があり、mb_check_encoding( "\x8f\xa2\xb7", "eucJP-win" ) など、PHP 5.2.0 以前では、TRUE、PHP 5.2.1 以降では FALSE になった文字がある

修正(2009.09.21): PHP 5.3.0 はリリースされましたので、記述を少し修正しました。

まだ続きます。あと、ISO-2022-JP と UTF-16 について書く予定です。
続きを書きました。