Pergunta

Olhe para a IBM's Unicode para o programador PHP que trabalha, especialmente as listagens 3 e 4.

No Ubuntu Lucid, recebo a mesma saída do código que a 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
)
Здравсствуйте

No entanto, no Windows, recebo uma resposta completamente diferente.

ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
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
)
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ

Além do fato de que os caracteres russos (que estão no UTF-32) não renderizam em um shell cmd.exe (porque estão no UTF-32 e não no próprio Windows no UTF-16), por que os valores do personagem diferem tão significativamente?

Foi útil?

Solução

function utf8_to_unicode_code($utf8_string)
{
    $expanded = iconv("UTF-8", "UTF-32", $utf8_string);
    return unpack("L*", $expanded);
}

Isso faz duas coisas erradas:

  1. Ele usa "UTF-32", que soltará um nascimento indesejado no início da string, e é por isso que você recebe 65279 (0xfeff BOM). Você não quer BOMs perdidos em torno do local causando problemas.

  2. Ele usa Byte Endianness específico para a máquina (capital L) que iconv pode bem não concordar com. Para ser sincero, eu não teria esperado Ele se chocou em uma caixa do Windows (como i386 é pouco endiano, independentemente do sistema operacional), mas claramente tem, pois os valores que você tem são tudo o que resultaria de uma ordem de byte revertida.

Melhor declarar explicitamente as duas ordenadas de bytes e evitar o nascimento. Usar UCS-4LE como a codificação e descompactar com V*. O mesmo vale para unicode_code_to_utf8.

Ignore também a listagem 6. O personagem ElipSis-como o Fi-Ligature e outros-é um 'caráter de compatibilidade' que não usaríamos no mundo moderno unicode e excesso. Cabe à fonte fornecer alternativas contextuais para fi ou ... Se quiser, em vez de exigir que magle o texto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top