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?

Était-ce utile?

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:

  1. 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.

  2. Il utilise octet spécifique à la machine boutisme (capitale L) qui pourrait bien iconv 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top