PHP и Unicode: странность между Windows и Linux
Вопрос
Посмотрите на IBM's Unicode для рабочего программиста PHP, особенно листинги 3 и 4.
На Ubuntu я получаю тот же выход из кода, как IBM, Viz:
Здравсствуйте
Array
(
[1] => 65279
[2] => 1047
[3] => 1076
[4] => 1088
[5] => 1072
[6] => 1074
[7] => 1089
[8] => 1089
[9] => 1090
[10] => 1074
[11] => 1091
[12] => 1081
[13] => 1090
[14] => 1077
)
Здравсствуйте
Однако на Windows я получаю совершенно другой ответ.
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
Array
(
[1] => -131072
[2] => 386138112
[3] => 872677376
[4] => 1074003968
[5] => 805568512
[6] => 839122944
[7] => 1090781184
[8] => 1090781184
[9] => 1107558400
[10] => 839122944
[11] => 1124335616
[12] => 956563456
[13] => 1107558400
[14] => 889454592
)
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
Помимо того, что российские символы (которые находятся в UTF-32), не визуализируют в оболочке Cmd.exe (потому что они в UTF-32, а не Windows «NOTF-16), почему значения символов отличаются Так что значительно?
Решение
function utf8_to_unicode_code($utf8_string)
{
$expanded = iconv("UTF-8", "UTF-32", $utf8_string);
return unpack("L*", $expanded);
}
Это делает две вещи неверными:
Он использует «UTF-32», что упадет нежелательный спектр в начале строки, поэтому вы получаете 65279 (0xFeff BOM). Вы не хотите бездомных бомов, висящих вокруг места, вызывающего неприятности.
Он использует специальную байтовую цену (капитал
L
) которыйiconv
вполне может не согласиться с. Быть честным, у меня не было бы ожидал Чтобы столкнуться на коробке Windows (так как I386 - это маленький Endian независимо от ОС), но ясно, что он имеет, поскольку значения, которые у вас есть, - это все, что будет привести к обращению обратного байта.
Лучше указать оба заказа байтов явно, и избежать спецификации. Использовать UCS-4LE
Как кодировка, и распаковать с V*
. Отказ То же самое касается unicode_code_to_utf8
.
Также игнорируйте листинг 6. Характеристики эллипса, похожи на фигурную лигатуру и другие - это «символ совместимости», который мы бы не использовали в современном мире Unicode-and-opentype. Это зависит от шрифта для предоставления контекстных альтернатив для fi
или ...
Если он хочет, вместо того, чтобы требовать, чтобы мы слегли текст.