2011-01-15 8 views
7

So che ultimamente ultimamente il web si sta standardizzando verso UTF-8 e mi stavo chiedendo se ci fosse un posto dove usare UTF-8 sarebbe una brutta cosa. Ho sentito l'argomento che UTF-8, 16, ecc. Può usare più spazio ma alla fine è stato trascurabile.C'è qualche ragione per non usare UTF-8, 16, ecc. Per tutto?

Inoltre, cosa succede nei programmi Windows, nella shell di Linux e cose di questa natura? È possibile utilizzare in modo sicuro UTF-8 lì?

+0

Per i protocolli esistenti che non supportano UTF-8, questa è una buona ragione per non usare UTF-8 :) Personalmente mi piace solo supportare la codifica UTF-8 in quanto consente di caratteri unicode pur permettendo alla mia vita di ruotare attorno al ASCII character-space (l'apertura del contenuto di UTF-16 in un editor "stupido" mi fa sanguinare gli occhi). –

+0

@pst: B e c a u s i o o k s i i k i t h i s? – dan04

risposta

1

Se UTF-32 è disponibile, preferirlo rispetto alle altre versioni per l'elaborazione.

Se la piattaforma supporta nativamente Unicode UTF-32/UCS-4 - allora le versioni "compresse" UTF-8 e UTF-16 potrebbero essere più lente, poiché utilizzano un numero variabile di byte per ciascun carattere (sequenze di caratteri), il che rende impossibile fare una ricerca diretta in una stringa per indice, mentre UTF-32 usa 32 bit "flat" per ogni carattere, accelerando molto le operazioni con le stringhe.

Naturalmente, se si sta programmando in un ambiente molto limitato sistemi come, ad esempio, integrati e può essere certi ci sarà solo ASCII o ISO caratteri 8859-x in tutto, mai, allora si può scelto quei set di caratteri per efficienza e velocità. Ma in generale, attenersi ai formati di trasformazione Unicode .

+2

UTF-32 occupa lo spazio di 4x4 (o UTF-8 durante la codifica di caratteri ASCII) per gli stessi dati. Questo può sicuramente avere importanza. Inoltre, a differenza dei set di caratteri "legacy" come ISO-8859- * (e diversamente da UTF-8), hai problemi di endianness di ordine byte con UTF-32 e UTF-16. – dkarp

+0

["UTF-32 (o UCS-4) è un protocollo per la codifica di caratteri Unicode che utilizza esattamente 32 bit per ciascun punto di codice Unicode .Tutti gli altri formati di trasformazione Unicode utilizzano codifiche a lunghezza variabile. una rappresentazione diretta del suo punto di codice. "] (http://en.wikipedia.org/wiki/UTF-32/UCS-4) – dkarp

+0

@dkarp Basta ricontrollare e hai ragione. Il mio male –

0

Quando è necessario scrivere un programma (esecuzione di manipolazioni di stringhe) che deve essere molto veloce e sicuro di non aver bisogno di caratteri esotici, è possibile che UTF-8 non sia l'idea migliore. In ogni altra situazione, UTF-8 dovrebbe essere uno standard.

UTF-8 funziona bene su quasi tutti i software recenti, anche su Windows.

+0

Bene, * puoi * scrivere software basato su UTF-8 su Windows (l'ho fatto), ma devi evitare funzioni come 'fopen' che prendono una stringa" ANSI ":-( – dan04

+0

Cosa? Fopen? che lingua? Ho detto che era impossibile scrivere software su Windows basato su UTF-8?Non capisco il tuo punto. O forse qualcuno ha cancellato il suo commento. –

0

È noto che utf-8 funziona in modo ottimale per lo storage di file e il trasporto di rete. Ma la gente discute se utf-16/32 sono migliori per l'elaborazione. Un argomento importante è che utf-16 è ancora di lunghezza variabile e anche utf-32 non è ancora un punto di codice per carattere, quindi come sono meglio di utf-8? La mia opinione è che utf-16 è un ottimo compromesso.

In primo luogo, i caratteri fuori lato di BMP che necessitano di punti di doppio codice in utf-16 sono estremamente usati raramente. I personaggi cinesi (anche alcuni altri personaggi asiatici) in quell'intervallo sono fondamentalmente morti. Le persone normali non le useranno affatto, eccetto che gli esperti le usino per digitalizzare libri antichi. Quindi, utf-32 sarà una perdita la maggior parte del tempo. Non preoccuparti troppo di quei personaggi, in quanto non renderanno il tuo software in cattiva luce se non li gestisci correttamente, purché il tuo software non sia adatto a quegli utenti speciali.

In secondo luogo, spesso è necessario che l'allocazione della memoria delle stringhe sia correlata al conteggio dei caratteri. per esempio. una colonna di stringhe di database per 10 caratteri (supponendo di memorizzare una stringa unicode in formato normalizzato), che sarà di 20 byte per utf-16. Nella maggior parte dei casi funzionerà proprio così, tranne che in casi estremi conterrà solo 5-8 caratteri. Ma per utf-8, la lunghezza di byte comune di un carattere è 1-3 per le lingue occidentali e 3-5 per le lingue asiatiche. Il che significa che abbiamo bisogno di 10-50 byte anche per i casi comuni. Più dati, più elaborazione.

+0

Non sono d'accordo con "Non preoccuparti troppo di quei personaggi, in quanto non renderanno il tuo software in cattiva luce se non li gestisci correttamente". Dire "Il mio programma usa/supporta UTF-16" quando intendi "Il mio programma usa/supporta un sottoinsieme di UTF-16" è ingenuo o una menzogna. Gli insetti sono una cosa; intenzionalmente non supportare l'intero UTF-16 non è un bug. – Kevin

Problemi correlati