我正在使用mb_detect_encoding()函数来检查字符串是否包含非latin1(ISO-8859-1)字符。
由于日语不是latin1的一部分,我将它用作测试字符串中的文本,但是当字符串传入函数时,它似乎返回ISO-8859-1的确定。示例代码:
$str = "これは日本語のテキストです。読めますか";
$res = mb_detect_encoding($str,"ISO-8859-1",true);
print $res;
我尝试使用'ASCII'代替'ISO-8859-1',它正确返回false。有人能够解释这种差异吗?
答案 0 :(得分: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