2016-10-07 6 views
2

mb_detect_encodingとmb_check_encodingという2つの関数のロジックを理解しようとしていますが、ドキュメントが貧弱です。 Windowsの-1252エンコーディングを使用した場合、小文字である非常に簡単なテスト文字列PHPのmb_detect_encoding関数とmb_check_encoding関数の結果を理解する

$string = "\x65\x92"; 

で始まる「」カーリー引用符が続きます。

私は次のような結果を得る:

mb_detect_encoding($string,"Windows-1252"); //false 
mb_check_encoding($string,"Windows-1252"); //true 
mb_detect_encoding($string,"ISO-8859-1"); //ISO-8859-1 
mb_check_encoding($string,"ISO-8859-1"); //true 
mb_detect_encoding($string,"UTF-8",true); //false 
mb_detect_encoding($string,"UTF-8"); //UTF-8 
mb_check_encoding($string,"UTF-8"); //false 

detect_encodingが文字列ではなく、 "Windowsの-1252" は、 "ISO-8859-1" を与える理由https://en.wikipedia.org/wiki/ISO/IEC_8859-1https://en.wikipedia.org/wiki/Windows-1252によると、私は、理解していませんバイトx92はWindows-1252文字エンコーディングで定義されていますが、ISO-8859-1では定義されていません。

第2に、detect_encodingがfalseを返す方法はわかりませんが、check_encodingは同じ文字列と同じ文字エンコーディングに対してtrueを返すことができます。

最後に、私はなぜ文字列がすべてUTF-8、厳密なモードとして検出されるか理解できません。バイトx92は、UTF-8の継続バイトですが、この文字列では、シーケンスの先頭バイトではなく、有効な文字バイトです。

答えて

0

あなたの例は、直感的ではなく、論理的に間違っているかもしれないので、なぜmb_detect_encodingを控えめに使用するべきかを示す良い仕事をしています。三番目のパラメータとしてstrict = trueで、それを使用しなければならない場合、は常にパス(その非UTF8文字列がUTF8として報告されません。

それは希望エンコーディングの配列上mb_check_encodingを実行するために、もう少し信頼性の高いです、可能性/優先度の高い順に例えば:。

$encodings = [ 
    'UTF-8', 
    'Windows-1252', 
    'SJIS', 
    'ISO-8859-1', 
]; 

$encoding = 'UTF-8'; 
$string = 'foo'; 
foreach ($encodings as $encoding) { 
    if (mb_check_encoding($string, $encoding)) { 
     // We'll assume encoding is $encoding since it's valid 
     break; 
    } 
} 

順序はかかわらず、あなたの優先順位に依存