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;

我试过使用'ASCII'而不是'ISO-8859-1',它正确返回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 回答