Расхождение mb_detect_encoding () для нелатинских символов 1 - PullRequest
2 голосов
/ 22 марта 2011

Я использую функцию mb_detect_encoding (), чтобы проверить, содержит ли строка символы, не являющиеся латинскими (ISO-8859-1).

Так как японский не является частью латиницы 1, я использую его как текст в тестовой строке, но когда строка передается в функцию, кажется, она возвращает нормально для ISO-8859-1.Пример кода:

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

print  $res;

Я пытался использовать 'ASCII' вместо 'ISO-8859-1', что правильно возвращает false.Кто-нибудь может объяснить расхождение?

1 Ответ

0 голосов
/ 22 марта 2011

Я хотел быть смешным и сказать, что 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

...