Qual è la differenza tra UTF-8 e Unicode?


505

Ho sentito opinioni contrastanti da parte di persone - secondo la pagina UTF-8 di Wikipedia .

Sono la stessa cosa, vero? Qualcuno può chiarire?


1
Ciò che questo WIKI scrive sull'unicode e sugli UTF è ok secondo me. Alcuni commenti su di esso sono strani: "È possibile in UTF-8 (o qualsiasi altra codifica multi-byte) dividere o troncare una stringa nel mezzo di un carattere, il che può risultare in una stringa non valida." Quindi una stringa che viene codificata UTF-8 non è più una stringa ma un array di byte o un flusso di byte. I caratteri che compongono la stringa vengono codificati. Naturalmente può anche essere decodificato. Ora ovviamente puoi tagliare una sequenza utf-8 dopo il byte iniziale o dopo un byte successivo, ma perché qualcuno dovrebbe farlo?
luminoso il

Questo articolo sui tipi di dati stringa è educativo: mortoray.com/2013/11/27/the-string-type-is-broken - a volte quando si lavora con le stringhe e i loro componenti a livello di byte, è possibile tagliare inavvertitamente un carattere a metà .
Everett,

Risposte:


497

Per espandere le risposte che altri hanno dato:

Abbiamo molte lingue con molti personaggi che i computer dovrebbero idealmente visualizzare. Unicode assegna a ciascun carattere un numero univoco o un punto di codice.

I computer gestiscono numeri come byte ... saltando un po 'di storia qui e ignorando i problemi di indirizzamento della memoria, i computer a 8 bit tratteranno un byte a 8 bit come la più grande unità numerica facilmente rappresentabile sull'hardware, i computer a 16 bit si espanderebbero quello a due byte e così via.

Le vecchie codifiche di caratteri come ASCII risalgono all'era (pre) a 8 bit e cercano di stipare la lingua dominante nell'informatica al momento, ovvero l'inglese, in numeri che vanno da 0 a 127 (7 bit). Con 26 lettere dell'alfabeto, sia in forma maiuscola che non maiuscola, numeri e segni di punteggiatura, ha funzionato abbastanza bene. ASCII è stato esteso di un ottavo bit per altre lingue non inglesi, ma i 128 numeri / punti di codice aggiuntivi resi disponibili da questa espansione sarebbero mappati a caratteri diversi a seconda della lingua visualizzata. Gli standard ISO-8859 sono le forme più comuni di questa mappatura; ISO-8859-1 e ISO-8859-15 (noto anche come ISO-Latin-1, latin1 e sì, esistono anche due diverse versioni dello standard ISO 8859).

Ma questo non è abbastanza quando vuoi rappresentare i caratteri di più di una lingua, quindi stipare tutti i caratteri disponibili in un singolo byte non funzionerà.

Esistono essenzialmente due diversi tipi di codifica: uno espande l'intervallo di valori aggiungendo più bit. Esempi di queste codifiche sarebbero UCS2 (2 byte = 16 bit) e UCS4 (4 byte = 32 bit). Soffrono intrinsecamente dello stesso problema degli standard ASCII e ISO-8859, poiché la loro gamma di valori è ancora limitata, anche se il limite è molto più alto.

L'altro tipo di codifica utilizza un numero variabile di byte per carattere e le codifiche più comunemente conosciute per questo sono le codifiche UTF. Tutte le codifiche UTF funzionano all'incirca allo stesso modo: si sceglie una dimensione di unità, che per UTF-8 è 8 bit, per UTF-16 è 16 bit e per UTF-32 è 32 bit. Lo standard definisce quindi alcuni di questi bit come flag: se sono impostati, l'unità successiva in una sequenza di unità deve essere considerata parte dello stesso carattere. Se non sono impostati, questa unità rappresenta completamente un personaggio. Pertanto, i caratteri più comuni (in inglese) occupano solo un byte in UTF-8 (due in UTF-16, 4 in UTF-32), ma i caratteri di altre lingue possono occupare almeno sei byte.

Le codifiche multi-byte (dovrei dire multi-unità dopo la spiegazione sopra) hanno il vantaggio di essere relativamente efficienti in termini di spazio, ma il rovescio della medaglia che operazioni come la ricerca di sottostringhe, confronti, ecc. Devono tutti decodificare i caratteri in codice unicode punti prima che tali operazioni possano essere eseguite (ci sono alcune scorciatoie, però).

Sia gli standard UCS che gli standard UTF codificano i punti di codice definiti in Unicode. In teoria, queste codifiche potrebbero essere utilizzate per codificare qualsiasi numero (all'interno dell'intervallo supportato dalla codifica) - ma naturalmente queste codifiche sono state fatte per codificare punti di codice Unicode. E questa è la tua relazione tra loro.

Windows gestisce le cosiddette stringhe "Unicode" come stringhe UTF-16, mentre oggigiorno la maggior parte degli UNIX utilizza UTF-8. I protocolli di comunicazione come HTTP tendono a funzionare meglio con UTF-8, poiché le dimensioni dell'unità in UTF-8 sono le stesse di ASCII e la maggior parte di tali protocolli sono stati progettati nell'era ASCII. D'altra parte, UTF-16 offre le migliori prestazioni di spazio / elaborazione medie quando si rappresentano tutte le lingue viventi.

Lo standard Unicode definisce meno punti di codice di quanti possano essere rappresentati in 32 bit. Pertanto, per tutti gli scopi pratici, UTF-32 e UCS4 sono diventati la stessa codifica, poiché è improbabile che tu abbia a che fare con caratteri multi-unità in UTF-32.

Spero che riempia alcuni dettagli.


9
Concettualmente, UCS-2 e UCS-4 sono insiemi di caratteri , non codifiche di caratteri (da cui il nome).
Lumaca meccanica

74
@Tuukka Gli errori in questo post sono legione. Esistono più di 2 sole versioni di ISO 8859. ASCII non ha funzionato per l'inglese, mancando cose come virgolette, segni di centesimo, accenti e molto altro ancora - Unicode non riguarda solo l'inglese; Anche l'inglese ne ha bisogno !! Nessun punto di codice occupa più di 4 byte in QUALSIASI codifica; questa attività a 6 byte è completamente sbagliata. Non è possibile codificare UTF su alcun valore scalare Unicode come dice questo: i surrogati e gli altri 66 non caratteri sono tutti vietati. UCS-4 e UTF-32 non sono gli stessi. Non esiste UTF-32 multi-unità. UTF-16 non è così efficiente come pretendono - & c & c & c!
tchrist,

1
ASCII inoltre non contiene il simbolo di sterlina £, e ovviamente non contiene il simbolo dell'euro € (che è considerevolmente più giovane di ASCII).
TRiG

1
@tchrist Sembra che dopo tutto 6 byte non siano improbabili. Vedi questo: joelonsoftware.com/articles/Unicode.html che indica che c'è uno spazio caratteri da 0x04000000a 0x7FFFFFFF, o in binario è 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv - e che in effetti è 6 byte. Tuttavia, 6 byte è il massimo e non come l'articolo afferma confusamente "sei byte o più ".
syntaxerror,

12
@syntaxerror: "Solo i punti di codice 128 e superiori sono memorizzati utilizzando 2, 3, in effetti, fino a 6 byte." era accurato quando è stato scritto, ma più tardi nello stesso anno (dodici anni fa) è stato invalidato. en.wikipedia.org/wiki/UTF-8 dice "Le specifiche originali coprivano numeri fino a 31 bit (il limite originale del set di caratteri universale). Nel novembre 2003, UTF-8 è stato limitato da RFC 3629 per terminare con U + 10FFFF, al fine di abbinare i vincoli della codifica dei caratteri UTF-16. Ciò ha rimosso tutte le sequenze a 5 e 6 byte e circa la metà delle sequenze a 4 byte. "
Mooing Duck,

237

Vorrei usare un esempio per illustrare questo argomento:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Finora niente di magico, è molto semplice. Ora, supponiamo che decidiamo di memorizzare questo personaggio sul nostro disco rigido. Per fare ciò, dobbiamo memorizzare il personaggio in formato binario. Possiamo semplicemente memorizzarlo così com'è '01101100 01001001'. Fatto!

Ma aspetta un minuto, '01101100 01001001' è uno o due caratteri? Sapevi che questo è un personaggio perché te l'ho detto, ma quando un computer lo legge, non ne ha idea. Quindi abbiamo bisogno di una sorta di "codifica" per dire al computer di trattarlo come tale.

È qui che entrano in gioco le regole di "UTF-8": http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

Secondo la tabella sopra, se vogliamo memorizzare questo personaggio usando il formato "UTF-8", dobbiamo aggiungere il prefisso al nostro personaggio con alcune "intestazioni". Il nostro carattere cinese è lungo 16 bit (conta tu stesso il valore binario), quindi useremo il formato nella riga 3 in quanto fornisce spazio sufficiente:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Scrivi il risultato in una riga:

11100110 10110001 10001001

Questo è il valore UTF-8 (binario) del carattere cinese! (confermalo tu stesso: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Sommario

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

PS Se vuoi imparare questo argomento in Python, clicca qui


6
"Ma aspetta un minuto, è '01101100 01001001' un personaggio o due personaggi? Sapevi che questo è un personaggio perché te l'ho detto, ma quando un computer lo legge, non ne ha idea. Quindi abbiamo bisogno di una sorta di" codifica "per dì al computer di trattarlo come tale ". Bene ok, ma il computer non sa ancora che dovrebbe codificarlo con utf-8?
Koray Tugay,

15
@KorayTugay Il computer non sa quale codifica dovrebbe usare. Devi dirlo quando salvi un personaggio in un file e anche quando leggi un personaggio da un file.
Cheng,

3
@Connor Il computer non sa quale formato utilizzare. Quando si salva il documento, l'editor di testo deve impostare esplicitamente la sua codifica su utf-8 o in qualsiasi formato l'utente desideri utilizzare. Inoltre, quando un programma di editor di testi legge un file, deve selezionare uno schema di codifica per decodificarlo correttamente. Lo stesso vale quando si digita e si immette una lettera, l'editor di testo deve sapere quale schema si utilizza in modo da salvarlo correttamente.
Cheng,

2
Quindi, come vengono interpretate quelle intestazioni? se guardo la prima tabella allora penso: se il byte inizia con il bit, 0allora il carattere è rappresentato da 1 morso (quello corrente), se il byte inizia con 110il carattere, allora è rappresentato da 2 byte (il corrente e il successivo ( bit rimanenti dopo 10)), se il byte inizia con 1110allora il carattere è rappresentato da 3 byte, i 2 byte correnti e quelli successivi (bit rimanenti dopo 10).
JBoy,

2
Leggi 10 articoli su UTF-8; dopo aver letto questo ho capito in 10 secondi :)
jrhee17

201

"Unicode" è purtroppo usato in vari modi, a seconda del contesto. Il suo uso più corretto (IMO) è come un set di caratteri codificati , ovvero un set di caratteri e una mappatura tra i caratteri e i punti di codice intero che li rappresentano.

UTF-8 è una codifica dei caratteri, un modo per convertire da sequenze di byte a sequenze di caratteri e viceversa. Copre l'intero set di caratteri Unicode. ASCII è codificato come un singolo byte per carattere e altri caratteri prendono più byte a seconda del loro punto di codice esatto (fino a 4 byte per tutti i punti di codice attualmente definiti, cioè fino a U-0010FFFF, e in effetti 4 byte potrebbero farcela fino a U-001FFFFF).

Quando "Unicode" viene utilizzato come nome di una codifica dei caratteri (ad es. Come la proprietà .NET Encoding.Unicode ) di solito significa UTF-16 , che codifica i caratteri più comuni come due byte. Alcune piattaforme (in particolare .NET e Java) usano UTF-16 come codifica dei caratteri "nativi". Questo porta a problemi pelosi se devi preoccuparti di personaggi che non possono essere codificati in un singolo valore UTF-16 (sono codificati come "coppie surrogate") - ma la maggior parte degli sviluppatori non si preoccupa mai di questo, IME.

Alcuni riferimenti su Unicode:


16
Penso che UTF-16 sia uguale solo a "Unicode" su piattaforme Windows. Le persone tendono ad usare UTF-8 di default su * nix. +1 però, buona risposta
jalf

10
@Chris: No, ISO-8859-1 non è UTF-8. UTF-8 codifica da U + 0080 a U + 00FF come due byte, non uno. Windows 1252 e ISO-8859-1 sono per lo più gli stessi, ma differiscono tra i valori 0x80 e 0x99 se ricordo bene, dove ISO 8859-1 ha un "buco" ma CP1252 definisce i caratteri.
Jon Skeet,

13
L'idea di chiamare UTF-16 "Unicode" mi mette a disagio a causa del suo potenziale confusione, anche se questo è stato chiaramente indicato solo come una convenzione .NET. UTF-16 è un modo di rappresentare Unicode, ma non è "La codifica Unicode".
thomasrutter,

6
@unwesen: UTF-8 non ha bisogno di coppie surrogate. Rappresenta solo caratteri non BMP utilizzando sequenze di byte progressivamente più lunghe.
Jon Skeet,

5
@RoyiNamir: Sì, purtroppo "Unicode" è spesso usato per indicare "UTF-16", in particolare in Windows.
Jon Skeet,

108

Non sono la stessa cosa: UTF-8 è un modo particolare di codificare Unicode.

Esistono molte codifiche diverse tra cui scegliere a seconda dell'applicazione e dei dati che si intende utilizzare. I più comuni sono UTF-8, UTF-16 e UTF-32 per quanto ne so.


10
tuttavia, il punto è che alcuni editor propongono di salvare il file come "Unicode" O "UTF-8". Quindi la menzione di quel "Unicode" in quel caso è UTF-16 che ritengo necessaria.
serhio,

71

Unicode definisce solo punti di codice , ovvero un numero che rappresenta un carattere. Il modo in cui memorizzi questi punti di codice in memoria dipende dalla codifica che stai utilizzando. UTF-8 è un modo per codificare i caratteri Unicode, tra molti altri.


2
tuttavia, il punto è che alcuni editor propongono di salvare il file come "Unicode" O "UTF-8". Quindi la menzione di quel "Unicode" in quel caso è UTF-16 che ritengo necessaria.
serhio,

Un numero, che presenta un personaggio, fa anche ASCII.
luminoso

6
leggi questo prima e dopo aver visto il resto delle risposte in questa pagina
Dodgie,

33

Unicode è uno standard che definisce, insieme a ISO / IEC 10646, Universal Character Set (UCS) che è un superset di tutti i caratteri esistenti richiesti per rappresentare praticamente tutte le lingue conosciute.

Unicode assegna un nome e un numero ( codice carattere o punto di codice ) a ciascun carattere nel suo repertorio.

La codifica UTF-8 è un modo per rappresentare digitalmente questi caratteri nella memoria del computer. UTF-8 mappa ogni punto di codice in una sequenza di ottetti (byte a 8 bit)

Ad esempio,

Carattere UCS = Carattere Han Unicode

Punto di codice UCS = U + 24B62

Codifica UTF-8 = F0 A4 AD A2 (esadecimale) = 11110000 10100100 10101101 10100010 (bin)


No, UTF-8 mappa solo punti di codice in una sequenza maggiore di 127. Tutto da 0 a 127 non è una sequenza ma un singolo byte. A proposito, ASCII assegna anche un Nome di un carattere a un numero, quindi questo è lo stesso di Unicode. Ma Unicode non si ferma al punto di codice 127 ma sale a 0x10ffff.
luminoso

2
@brightly differisco. I caratteri Ascii sono infatti mappati su una sequenza a singolo byte. Il primo bit, che è 0 nel caso del codice per i caratteri ASCII, indica quanti byte seguono - zero. http://www.wikiwand.com/en/UTF-8#/DescriptionDai un'occhiata alla prima fila.
sentieri notturni,

Bene per me una sequenza è composta da più di un byte. Un carattere ASCII all'interno di UTF-8 è un singolo byte così com'è, con il bit più significativo impostato su 0. I punti di codice superiori a 127 necessitano quindi di sequenze, che hanno sempre un startbyte e uno, due o tre byte successivi. Quindi perché dovresti chiamare un singolo byte una "sequenza"?
luminoso

Bene ... Molte volte gli avvocati di lingua inglese possono confondersi con l'uso intenzionale del software. È lo stesso caso qui. Puoi discuterne. Ma questo non lo chiarirà.
sentieri notturni

1
@brighty Hmmm, In matematica, una sequenza di 0 elementi è OK. Anche qui una sequenza di 1 elemento va bene.
chux - Ripristina Monica il

24

Unicode è solo uno standard che definisce un set di caratteri ( UCS ) e codifiche ( UTF ) per codificare questo set di caratteri. Ma in generale, Unicode è riferito al set di caratteri e non allo standard.

Leggi il minimo assoluto Ogni sviluppatore di software deve assolutamente conoscere positivamente Unicode e set di caratteri (senza scuse!) E Unicode in 5 minuti .


1
@serhio: lo so. Sebbene esistano tre diverse codifiche UTF-16: le due UTF-16LE e UTF-16BE esplicite e l' UTF-16 implicito in cui l'endianness è specificata con una distinta base.
Gumbo,

@Gumbo: la mancanza di una DBA non significa che abbia una codifica diversa. Ci sono solo due codifiche.
Mooing Duck,

Il blog sopra è scritto dal CEO di Stakcoverflow.
Shailesh Pratapwar,

23

Le risposte esistenti spiegano già molti dettagli, ma ecco una risposta molto breve con la spiegazione e l'esempio più diretti.

Unicode è lo standard che associa i caratteri ai punti di codice.
Ogni personaggio ha un punto di codice univoco (numero di identificazione), che è un numero come 9731.

UTF-8 è la codifica dei punti di codice.
Per memorizzare tutti i caratteri sul disco (in un file), UTF-8 divide i caratteri in un massimo di 4 ottetti (sequenze di 8 bit) - byte. UTF-8 è una delle numerose codifiche (metodi di rappresentazione dei dati). Ad esempio, in Unicode, il punto di codice (decimale) 9731 rappresenta un pupazzo di neve ( ), che consiste di 3 byte in UTF-8:E2 98 83

Ecco un elenco ordinato con alcuni esempi casuali .


1
No! UTF-8 è un bel modo per codificare caratteri Unicode ma possiamo codificare anche in UTF-16 o UTF-32. Con UTF-32 abbiamo una relazione 1: 1 tra DWORD e punto di codice, con UTF-16 abbiamo una relazione 1: 1 tra WORD e punto di codice solo per i punti di codice del BMP, esclusi i surrogati e le distinte base. In UTF-8 abbiamo una relazione 1: 1 tra byte e punto di codice solo per punti di codice <127.
luminoso

5
@brighty: giusto, ma perché "No!"? Ho scritto "UTF-8 è una delle numerose codifiche" perché ci sono anche UTF-16 e UTF-32.
basic6

16

1. Unicode

Ci sono molti personaggi in tutto il mondo, come "$, &, h, a, t,?, 张, 1, =, + ...".

Poi arriva un'organizzazione che si dedica a questi personaggi,

Hanno creato uno standard chiamato "Unicode".

Lo standard è il seguente:

  • creare un modulo in cui ogni posizione è denominata "punto di codice" o "posizione di codice".
  • Le posizioni intere vanno da U + 0000 a U + 10FFFF;
  • Fino ad ora, alcune posizioni sono piene di caratteri e altre posizioni sono salvate o vuote.
  • Ad esempio, la posizione "U + 0024" è riempita con il carattere "$".

PS: Naturalmente c'è un'altra organizzazione chiamata ISO che mantiene un altro standard: "ISO 10646" , quasi lo stesso.

2. UTF-8

Come sopra, U + 0024 è solo una posizione, quindi non possiamo salvare "U + 0024" nel computer per il carattere "$".

Ci deve essere un metodo di codifica.

Poi arrivano i metodi di codifica, come UTF-8, UTF-16, UTF-32, UCS-2 ....

In UTF-8, il punto di codice "U + 0024" è codificato in 00100100.

00100100 è il valore che salviamo nel computer per "$".


1
In generale, UTF-8 è l'unica variante che chiunque usa oggi.
Rick James,

2
ISO 10646 è uno standard identico al set di caratteri Unicode. Unicode definisce molte altre cose oltre al set di caratteri, come regole per l'ordinamento, i casi, ecc. ISO 10646 è solo il set di caratteri (di cui attualmente ci sono oltre 130.000). Il consorzio Unicode e ISO sviluppano congiuntamente Unicode, con ISO che riguarda solo il set di caratteri e le sue codifiche, e Unicode definisce anche le proprietà e le regole dei caratteri per l'elaborazione del testo.
thomasrutter,

12

Ho controllato i collegamenti nella risposta di Gumbo e volevo incollare alcune parti di quelle cose qui anche su Stack Overflow.

"... Alcune persone hanno il malinteso che Unicode sia semplicemente un codice a 16 bit in cui ogni carattere prende 16 bit e quindi ci sono 65.536 caratteri possibili. Questo non è, in realtà, corretto. È il singolo mito più comune su Unicode , quindi se ci hai pensato, non stare male.

In effetti, Unicode ha un modo diverso di pensare ai personaggi e devi capire il modo di pensare Unicode delle cose o niente avrà senso.

Fino ad ora, abbiamo ipotizzato che una lettera si associ ad alcuni bit che è possibile memorizzare su disco o in memoria:

A -> 0100 0001

In Unicode, una lettera si associa a qualcosa chiamato un punto di codice che è ancora solo un concetto teorico. Come quel punto di codice sia rappresentato in memoria o su disco è tutta un'altra storia ... "

"... Ad ogni lettera platonica in ogni alfabeto viene assegnato un numero magico dal consorzio Unicode che è scritto in questo modo: U + 0639. Questo numero magico è chiamato punto di codice. L'U + significa" Unicode "ei numeri sono esadecimali. U + 0639 è la lettera araba Ain. La lettera inglese A sarebbe U + 0041 .... "

"... OK, quindi diciamo che abbiamo una stringa:

Ciao

che, in Unicode, corrisponde a questi cinque punti di codice:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Solo un mucchio di punti di codice. Numeri, davvero. Non abbiamo ancora detto nulla su come archiviarlo in memoria o rappresentarlo in un messaggio di posta elettronica ... "

"... Ecco dove arrivano le codifiche.

La prima idea per la codifica Unicode, che ha portato al mito dei due byte, è stata, ehi, archiviamo quei numeri in due byte ciascuno. Quindi Hello diventa

00 48 00 65 00 6C 00 6C 00 6F

Giusto? Non così in fretta! Non potrebbe anche essere:

48 00 65 00 6C 00 6C 00 6F 00? ..."


In ASCII, una lettera si associa anche a un punto di codice, non solo in Unicode.
luminoso

8

UTF-8 è uno schema di codifica possibile per il testo Unicode .

Unicode è uno standard di ampia portata che definisce oltre 130.000 caratteri e assegna a ciascuno un codice numerico (un punto di codice). Definisce inoltre le regole su come ordinare questo testo, normalizzarlo, cambiarne il case e altro. Un carattere in Unicode è rappresentato da un punto di codice compreso tra zero e 0x10FFFF incluso, sebbene alcuni punti di codice siano riservati e non possano essere utilizzati per i caratteri.

Esiste più di un modo in cui una stringa di punti di codice Unicode può essere codificata in un flusso binario. Questi sono chiamati "codifiche". La codifica più semplice è UTF-32 , che memorizza semplicemente ogni punto di codice come numero intero a 32 bit, ognuno dei quali è largo 4 byte.

UTF-8 è un'altra codifica e sta diventando lo standard di fatto, a causa di una serie di vantaggi rispetto a UTF-32 e altri. UTF-8 codifica come una sequenza di valori a byte singolo. Ciascun punto di codice può utilizzare un numero variabile di questi valori di byte. I punti di codice nell'intervallo ASCII sono codificati nudi, per essere compatibili con ASCII. I punti di codice al di fuori di questo intervallo utilizzano un numero variabile di byte, 2, 3 o 4, a seconda dell'intervallo in cui si trovano.

UTF-8 è stato progettato pensando a queste proprietà:

  • I caratteri ASCII sono codificati esattamente come in ASCII, in modo che una stringa ASCII sia anche una stringa UTF-8 valida.

  • Ordinamento binario: l'ordinamento delle stringhe UTF-8 utilizzando un ordinamento binario ingenuo comporterà comunque l'ordinamento di tutti i punti di codice in ordine numerico.

  • I caratteri che richiedono più byte non contengono alcun valore di byte nell'intervallo ASCII, garantendo che parte di essi non possano essere scambiati per caratteri ASCII. Questa è anche una funzione di sicurezza.

  • UTF-8 può essere facilmente convalidato e distinto dalle altre codifiche di caratteri da un validatore. Il testo in altre codifiche a 8 bit o multibyte molto raramente verrà convalidato anche come UTF-8.

  • Accesso casuale: in qualsiasi punto della stringa UTF-8 è possibile dire se il byte in quella posizione è il primo byte di un carattere o meno, e trovare l'inizio del carattere successivo o corrente, senza bisogno di scansionare in avanti o indietro più di qualche byte o leggi qualsiasi cosa all'inizio dello stream.


Un paio di punti minori: [1] I caratteri ASCII non dovrebbero essere codificati esattamente come in ASCII "non dovrebbero essere cambiati in " I caratteri ASCII sono codificati esattamente come in UTF-8 " ? [2] La frase "I codici in Unicode ..." non è chiara (per me). Vuoi dire "punti di codice Unicode ..." ?
skomisa,

@skomisa per il punto 1, intendevo dire che la codifica dei caratteri all'interno dell'intervallo ASCII è identica per ASCII e per UTF-8.
thomasrutter il

Per il punto 2, questo è un punto giusto e lo modificherò per renderlo più chiaro
thomasrutter il

2

Sono la stessa cosa, vero?

No, non lo sono.


Penso che la prima frase della pagina Wikipedia a cui hai fatto riferimento fornisca un breve riassunto:

UTF-8 è una codifica di caratteri a larghezza variabile in grado di codificare tutti i 1.112.064 punti di codice validi in Unicode utilizzando da uno a quattro byte a 8 bit.

Elaborare:

  • Unicode è uno standard che definisce una mappa da caratteri a numeri, i cosiddetti punti di codice (come nell'esempio seguente). Per la mappatura completa, puoi dare un'occhiata qui .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 è uno dei modi per codificare questi punti di codice in una forma che un computer può capire, ovvero i bit . In altre parole, è un modo / algoritmo per convertire ciascuno di quei punti di codice in una sequenza di bit o convertire una sequenza di bit in punti di codice equivalenti. Nota che ci sono molte codifiche alternative per Unicode.


Joel dà una spiegazione davvero piacevole e una panoramica della storia qui .


2

Se posso riassumere ciò che ho raccolto da questa discussione:

Unicode "traduce" i caratteri in numeri ordinali (in formato decimale) .

à = 224

UTF-8 è una codifica che "traduce" questi numeri in rappresentazioni binarie .

224 = 11000011 10100000

Si noti che stiamo parlando della rappresentazione binaria di 224, non della sua forma binaria, che è 0b11100000.


2

Questo articolo spiega tutti i dettagli http://kunststube.net/encoding/

SCRIVERE AL BUFFER

se scrivi su un buffer di 4 byte, simbolo con codifica UTF8, il tuo binario sarà simile al seguente:

00000000 11100011 10000001 10000010

se scrivi su un buffer di 4 byte, simbolo con codifica UTF16, il tuo binario sarà simile al seguente:

00000000 00000000 00110000 01000010

Come puoi vedere, a seconda della lingua che utilizzeresti nei tuoi contenuti, ciò influenzerà la tua memoria di conseguenza.

ad es. per questo particolare simbolo: la codifica UTF16 è più efficiente poiché abbiamo 2 byte di riserva da usare per il simbolo successivo. Ma ciò non significa che devi usare UTF16 per l'alfabeto giapponese.

LETTURA DAL BUFFER

Ora se vuoi leggere i byte sopra, devi sapere in quale codifica è stato scritto e decodificarlo correttamente.

ad es. se decodifichi questo: 00000000 11100011 10000001 10000010 nella codifica UTF16, finirai con non

Nota: la codifica e Unicode sono due cose diverse. Unicode è la grande (tabella) con ogni simbolo mappato su un punto di codice univoco. es. il simbolo (lettera) ha un (punto di codice) : 30 42 (esadecimale). La codifica, d'altra parte, è un algoritmo che converte i simboli in un modo più appropriato, quando si archivia su hardware.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

inserisci qui la descrizione dell'immagine


ottimo articolo collegato, si spera che continui a rimanere attivo
yolob 21

0

UTF-8 è un metodo per codificare i caratteri Unicode usando sequenze a 8 bit.

Unicode è uno standard per rappresentare una grande varietà di caratteri in molte lingue.


4
"Sequenze a 8 bit" ...? Potrebbe voler precisarlo più precisamente ...
ingannare
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.