Domanda

Va bene. So che questo sembra il tipico " Perché non ha semplicemente Google o non è andato su www.unicode. org e cercare? " , ma per una domanda così semplice la risposta mi sfugge ancora dopo aver controllato entrambe le fonti.

Sono abbastanza sicuro che tutti e tre questi sistemi di codifica supportino tutti i caratteri Unicode, ma devo confermarlo prima di presentare tale affermazione in una presentazione.

Domanda bonus: queste codifiche differiscono nel numero di caratteri che possono essere estese per supportare?

È stato utile?

Soluzione

No, sono semplicemente metodi di codifica diversi. Supportano tutti la codifica dello stesso set di caratteri.

UTF-8 utilizza ovunque da uno a quattro byte per carattere a seconda del carattere che stai codificando. I caratteri all'interno dell'intervallo ASCII richiedono solo un byte mentre i caratteri molto insoliti ne prendono quattro.

UTF-32 utilizza quattro byte per carattere indipendentemente dal carattere, quindi utilizzerà sempre più spazio di UTF-8 per codificare la stessa stringa. L'unico vantaggio è che puoi calcolare il numero di caratteri in una stringa UTF-32 contando solo i byte.

UTF-16 utilizza due byte per la maggior parte dei caratteri, quattro byte per quelli insoliti.

http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings

Altri suggerimenti

Non esiste un carattere Unicode che può essere archiviato in una codifica ma non in un'altra. Questo semplicemente perché i caratteri Unicode validi sono stati limitati a ciò che può essere archiviato in UTF-16 (che ha la più piccola capacità delle tre codifiche). In altre parole, UTF-8 e UTF-32 potrebbero essere utilizzati per rappresentare una gamma più ampia di caratteri rispetto a UTF-16, ma non sono . Continua a leggere per maggiori dettagli.

UTF-8

UTF-8 è un codice a lunghezza variabile. Alcuni caratteri richiedono 1 byte, alcuni richiedono 2, altri 3 e altri 4. I byte per ogni carattere sono semplicemente scritti uno dopo l'altro come un flusso continuo di byte.

Mentre alcuni caratteri UTF-8 possono essere lunghi 4 byte, UTF-8 non può codificare 2 ^ 32 caratteri . Non è nemmeno vicino. Proverò a spiegare le ragioni di ciò.

Il software che legge uno stream UTF-8 ottiene solo una sequenza di byte: come si può decidere se i prossimi 4 byte sono un singolo carattere a 4 byte, o due caratteri a 2 byte o quattro a 1 byte personaggi (o qualche altra combinazione)? Fondamentalmente questo viene fatto decidendo che determinate sequenze da 1 byte non sono caratteri validi, e determinate sequenze da 2 byte non sono caratteri validi, e così via. Quando compaiono queste sequenze non valide, si presume che facciano parte di una sequenza più lunga .

Ne hai visto un esempio piuttosto diverso, ne sono certo: si chiama fuga. In molti linguaggi di programmazione si decide che il carattere \ nel codice sorgente di una stringa non si traduca in alcun carattere valido nella stringa " compilata " modulo. Quando viene trovato un \ nella fonte, si presume che faccia parte di una sequenza più lunga, come \ n o \ xFF . Si noti che \ x è una sequenza di 2 caratteri non valida e \ xF è una sequenza di 3 caratteri non valida, ma \ xFF è valido Sequenza di 4 caratteri.

Fondamentalmente, c'è un compromesso tra avere molti personaggi e avere personaggi più corti. Se vuoi 2 ^ 32 caratteri, devono avere una lunghezza media di 4 byte. Se vuoi che tutti i tuoi caratteri siano di 2 byte o meno, non puoi avere più di 2 ^ 16 caratteri. UTF-8 offre un ragionevole compromesso: tutti i caratteri ASCII (ASCII da 0 a 127) vengono visualizzati 1- rappresentazioni di byte, il che è ottimo per la compatibilità, ma sono ammessi molti più caratteri.

Come la maggior parte delle codifiche a lunghezza variabile, inclusi i tipi di sequenze di escape mostrate sopra, UTF-8 è un istantaneo codice . Ciò significa che, il decodificatore legge solo byte per byte e non appena raggiunge l'ultimo byte di un carattere, conosce il carattere (e sa che non è l'inizio di un carattere più lungo).

Ad esempio, il carattere 'A' è rappresentato usando il byte 65 e non ci sono caratteri a due / tre / quattro byte il cui primo byte è 65. Altrimenti il ??decodificatore non sarebbe in grado di distinguere questi caratteri da una "A" seguita da qualcos'altro.

Ma UTF-8 è ulteriormente limitato. Assicura che la codifica di un carattere più breve non appaia mai ovunque all'interno della codifica di un carattere più lungo. Ad esempio, nessuno dei byte in un carattere a 4 byte può essere 65.

Poiché UTF-8 ha 128 caratteri 1 byte diversi (i cui valori byte sono 0-127), tutti i caratteri 2, 3 e 4 byte devono essere composti esclusivamente da byte nell'intervallo 128-256. Questa è una grande restrizione. Tuttavia, consente alle funzioni di stringa orientate al byte di funzionare con modifiche minime o nulle. Ad esempio, la funzione strstr() funziona sempre come previsto se i suoi input sono stringhe UTF-8 valide.

UTF-16

UTF-16 è anche un codice a lunghezza variabile; i suoi caratteri consumano 2 o 4 byte. I valori a 2 byte nell'intervallo 0xD800-0xDFFF sono riservati per la costruzione di caratteri a 4 byte e tutti i caratteri a 4 byte sono costituiti da due byte nell'intervallo 0xD800-0xDBFF seguiti da 2 byte nell'intervallo 0xDC00-0xDFFF. Per questo motivo, Unicode non assegna alcun carattere nell'intervallo U + D800-U + DFFF.

UTF-32

UTF-32 è un codice a lunghezza fissa, con ogni carattere lungo 4 byte. Sebbene ciò consenta la codifica di 2 ^ 32 caratteri diversi, in questo schema sono consentiti solo valori compresi tra 0 e 0x10FFFF.

Confronto della capacità:

  • UTF-8: 2.097.152 (in realtà 2.166.912 ma a causa dei dettagli di progettazione alcuni di essi sono associati alla stessa cosa)
  • UTF-16: 1.112.064
  • UTF-32: 4.294.967.296 (ma limitato ai primi 1.114.112)

Il più limitato è quindi UTF-16! La definizione Unicode formale ha limitato i caratteri Unicode a quelli che possono essere codificati con UTF-16 (ovvero l'intervallo da U + 0000 a U + 10FFFF escluso U + D800 a U + DFFF). UTF-8 e UTF-32 supportano tutti questi personaggi.

Il sistema UTF-8 è infatti "artificialmente" limitato a 4 byte. Può essere esteso a 8 byte senza violare le restrizioni che ho descritto in precedenza, e ciò produrrebbe una capacità di 2 ^ 42. La specifica UTF-8 originale consentiva infatti fino a 6 byte, il che dà una capacità di 2 ^ 31. Ma RFC 3629 lo ha limitato a 4 byte, poiché questo è quanto è necessario per coprire tutto ciò che UTF-16 sì.

Esistono altri schemi (principalmente storici) di codifica Unicode, in particolare UCS-2 (che è in grado di codificare solo da U + 0000 a U + FFFF).

UTF-8, UTF-16 e UTF-32 supportano tutti il ??set completo di punti di codice unicode. Non ci sono personaggi supportati da uno ma non da un altro.

Per quanto riguarda la domanda bonus " Queste codifiche differiscono nel numero di caratteri che possono essere estese per supportare? " Sì e no. Il modo in cui UTF-8 e UTF-16 sono codificati limita il numero totale di punti di codice che possono supportare a meno di 2 ^ 32. Tuttavia, il consorzio Unicode non aggiungerà punti di codice a UTF-32 che non possono essere rappresentati in UTF-8 o UTF-16. Ciò violerebbe lo spirito degli standard di codifica e renderebbe impossibile garantire un mapping uno a uno da UTF-32 a UTF-8 (o UTF-16).

Personalmente controllo sempre Post di Joel su unicode, codifiche e set di caratteri quando in dubbio.

Tutte le codifiche UTF-8/16/32 possono mappare tutti i caratteri Unicode. Vedi Confronto di Wikipedia delle codifiche Unicode .

Questo articolo IBM Codifica i tuoi documenti XML in UTF-8 è molto utile e indica se hai la scelta, è meglio scegliere UTF-8. Principalmente le ragioni sono l'ampio supporto degli strumenti e UTF-8 può di solito passare attraverso sistemi che non sono a conoscenza dell'unicode.

Dalla sezione Cosa dicono le specifiche nel Articolo IBM :

  

Sia il W3C che l'IETF hanno   recentemente diventato più irremovibile   scegliendo UTF-8 first, last e   a volte solo. Il personaggio del W3C   Modello per il World Wide Web 1.0:   Stati fondamentali, " Quando un unico   è richiesta la codifica dei caratteri, il   la codifica dei caratteri DEVE essere UTF-8,   UTF-16 o UTF-32. US-ASCII è   compatibile verso l'alto con UTF-8 (un   La stringa US-ASCII è anche una UTF-8   stringa, vedere [RFC 3629]) e UTF-8 è   quindi appropriato se compatibilità   con US-ASCII è desiderato. " Nel   pratica, compatibilità con US-ASCII   è così utile è quasi un   Requisiti. Il W3C spiega saggiamente,   " In altre situazioni, ad esempio per   Le API, UTF-16 o UTF-32 potrebbero essere più   adeguata. Possibili ragioni per   la scelta di uno di questi include   efficienza di elaborazione interna e   interoperabilità con gli altri   . Processi "

Come tutti hanno detto, UTF-8, UTF-16 e UTF-32 possono codificare tutti i punti di codice Unicode. Tuttavia, la variante UCS-2 (a volte erroneamente definita UCS-16) non può , e questa è quella che trovi ad es. in Windows XP / Vista .

Vedi Wikipedia per ulteriori informazioni.

Modifica: mi sbaglio su Windows, NT è stato l'unico a supportare UCS-2. Tuttavia, molte applicazioni Windows assumeranno una sola parola per punto di codice come in UCS-2, quindi è probabile che tu trovi dei bug. Vedi un altro articolo di Wikipedia . (Grazie JasonTrue)

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