2

mb_detect_encoding() 関数を使用して、文字列に latin1 (ISO-8859-1) 以外の文字が含まれているかどうかを確認しています。

日本語は latin1 の一部ではないため、テスト文字列内のテキストとして使用していますが、文字列が関数に渡されると、ISO-8859-1 に対して OK を返すようです。コード例:

$str = "これは日本語のテキストです。読めますか";
$res = mb_detect_encoding($str,"ISO-8859-1",true);

print  $res;

「ISO-8859-1」の代わりに「ASCII」を使用してみましたが、これは正しく false を返します。矛盾を説明できる人はいますか?

4

1 に答える 1

0

私は面白くなりたかったので、hexdump で説明できると言いました。

0000000 81e3 e393 8c82 81e3 e6af a597 9ce6 e8ac
0000010 9eaa 81e3 e3ae 8683 82e3 e3ad b982 83e3
0000020 e388 a781 81e3 e399 8280 aae8 e3ad 8182
0000030 81e3 e3be 9981 81e3 0a8b  

しかし、悲しいかな、それはまったく逆です。

ISO-8859-1 では、実際にはコード ポイント \x80-\x9F のみが無効です。しかし、これらはまさに日本語文字の UTF-8 表現が占めるバイト値です。

とにかく、mb_detect_encoding はヒューリスティックを使用します。そして、この例では失敗します。私の推測では、ISO-8859-1を -15 またはさらに悪いものと間違えていると思われます: CP1251 は互換性のない Windows 文字セットであり、上記のコード ポイントを許可します。

回避策を使用して、自分でテストするといいでしょう。文字列内のバイトが確かに Latin-1 文字ではないことを保証する唯一のチェックは次のとおりです。

preg_match('/[\x7F-\x9F]/', $str);

彼らの記事が違いを最もよく示しているので、私はドイツ語のウィキペディアにリンクしています: http://de.wikipedia.org/wiki/ISO_8859-1

于 2011-03-21T23:23:54.567 に答える