PHP e Unicode: Stranezze tra Windows e Linux
Domanda
Guarda di IBM Unicode per il lavoro programmatore PHP , in particolare elenchi 3 e 4.
Su Ubuntu Lucid ho la stessa uscita dal codice come fa IBM, vale a dire:
Здравсствуйте
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
)
Здравсствуйте
Tuttavia, su Windows ottengo una risposta completamente diversa.
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
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
)
ðùð┤ÐÇð░ð▓ÐüÐüÐéð▓Ðâð╣ÐéðÁ
A parte il fatto che i personaggi russi (che sono in UTF-32) non rendano in un guscio di CMD.EXE (perché sono in UTF-32 non Windows' proprio UTF-16), perchè la valori di carattere differiscono in modo significativo?
Soluzione
function utf8_to_unicode_code($utf8_string)
{
$expanded = iconv("UTF-8", "UTF-32", $utf8_string);
return unpack("L*", $expanded);
}
Questo fa due cose sbagliate:
-
Si utilizza “UTF-32”, che vi porterà una distinta base indesiderato all'inizio della stringa, che è il motivo per cui si ottiene 65279 (0xFEFF BOM). Se non si desidera distinte base randagi in giro il posto causando problemi.
-
Si utilizza endian byte specifico macchina (capitale
L
), cheiconv
non potrebbe essere d'accordo con. Ad essere onesti non avrei atteso è a scontrarsi su una scatola di Windows (come i386 è little-endian indipendentemente dal sistema operativo), ma chiaramente ha, come i valori che avete ottenuto quello che sono tutti deriverebbe da un ordine di byte inverso.
Meglio indicare entrambi ordinamenti di byte in modo esplicito, ed evitare la distinta. Uso UCS-4LE
come codifica, e decomprimere con V*
. Lo stesso vale per unicode_code_to_utf8
.
ignorano anche messa in vendita di 6. I puntini di sospensione carattere come il fi-legatura e altri, è un ‘personaggio compatibilità’ che non avremmo usato nel mondo moderno Unicode e OpenType-. E 'fino al font per fornire alternative contestuali per fi
o ...
se vuole, invece di richiedere noi di storpiare il testo.