PHP et Unicode: Weirdness entre Windows et Linux
Question
Regardez IBM Unicode pour le programmeur PHP travail , en particulier les annonces 3 et 4.
Sur Ubuntu Lucid je reçois la même sortie à partir du code tout comme IBM, à savoir:
Здравсствуйте
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
)
Здравсствуйте
Toutefois, sur Windows je reçois une réponse complètement différente.
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
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
)
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
Mis à part le fait que les caractères russes (qui sont en UTF-32) ne rendent pas dans un shell cmd.exe (parce qu'ils sont en UTF-32 ne propre UTF-16 de Windows), pourquoi les Les valeurs de caractères diffèrent de façon significative?
La solution
function utf8_to_unicode_code($utf8_string)
{
$expanded = iconv("UTF-8", "UTF-32", $utf8_string);
return unpack("L*", $expanded);
}
Ceci fait deux choses mal:
-
Il utilise « UTF-32 », qui chutera une nomenclature indésirable au début de la chaîne, qui est la raison pour laquelle vous obtenez 65279 (0xFEFF BOM). Vous ne voulez pas traîner errants BOM l'endroit causer des ennuis.
-
Il utilise octet spécifique à la machine boutisme (capitale
L
) qui pourrait bieniconv
pas d'accord avec. Pour être honnête, je n'aurais pas devrait à clash sur une boîte de Windows (comme i386 est peu endian quel que soit l'OS), mais il est clair qu'il a, comme les valeurs que vous avez sont tout ce résulterait d'un ordre d'octet inversé.
Il vaut mieux indiquer les deux octets ordonnancements explicitement, et éviter la nomenclature. Utilisez UCS-4LE
comme l'encodage et Déballez avec V*
. La même chose vaut pour unicode_code_to_utf8
.
Ne pas tenir compte aussi dans la liste 6. Le caractère comme le fi-ellipsis ligatures et autres, est un « caractère de compatibilité » que nous ne serions pas utiliser dans le monde Unicode et OpenType moderne. Il est à la police de fournir des alternatives contextuelles pour fi
ou ...
si elle veut, au lieu de nous obliger à estropier le texte.