Ho sentito opinioni contrastanti da parte di persone - secondo la pagina UTF-8 di Wikipedia .
Sono la stessa cosa, vero? Qualcuno può chiarire?
Ho sentito opinioni contrastanti da parte di persone - secondo la pagina UTF-8 di Wikipedia .
Sono la stessa cosa, vero? Qualcuno può chiarire?
Risposte:
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.
0x04000000
a 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ù ".
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 )
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
0
allora il carattere è rappresentato da 1 morso (quello corrente), se il byte inizia con 110
il carattere, allora è rappresentato da 2 byte (il corrente e il successivo ( bit rimanenti dopo 10
)), se il byte inizia con 1110
allora il carattere è rappresentato da 3 byte, i 2 byte correnti e quelli successivi (bit rimanenti dopo 10
).
"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:
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.
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.
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)
http://www.wikiwand.com/en/UTF-8#/Description
Dai un'occhiata alla prima fila.
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 .
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
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:
PS: Naturalmente c'è un'altra organizzazione chiamata ISO che mantiene un altro standard: "ISO 10646" , quasi lo stesso.
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 "$".
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? ..."
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.
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 .
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.
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.