Вопрос

Посмотрите на 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);
}

Это делает две вещи неверными:

  1. Он использует «UTF-32», что упадет нежелательный спектр в начале строки, поэтому вы получаете 65279 (0xFeff BOM). Вы не хотите бездомных бомов, висящих вокруг места, вызывающего неприятности.

  2. Он использует специальную байтовую цену (капитал L) который iconv вполне может не согласиться с. Быть честным, у меня не было бы ожидал Чтобы столкнуться на коробке Windows (так как I386 - это маленький Endian независимо от ОС), но ясно, что он имеет, поскольку значения, которые у вас есть, - это все, что будет привести к обращению обратного байта.

Лучше указать оба заказа байтов явно, и избежать спецификации. Использовать UCS-4LE Как кодировка, и распаковать с V*. Отказ То же самое касается unicode_code_to_utf8.

Также игнорируйте листинг 6. Характеристики эллипса, похожи на фигурную лигатуру и другие - это «символ совместимости», который мы бы не использовали в современном мире Unicode-and-opentype. Это зависит от шрифта для предоставления контекстных альтернатив для fi или ... Если он хочет, вместо того, чтобы требовать, чтобы мы слегли текст.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top