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?

È stato utile?

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:

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

  2. Si utilizza endian byte specifico macchina (capitale L), che iconv 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top