PHP e Unicode: estranheza entre Windows e Linux
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?
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:
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.
Ele usa Byte Endianness específico para a máquina (capital
L
) queiconv
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.