Qual è la differenza tra UTF-8 e Unicode

Ho sentito opinioni contrastanti da parte di persone – secondo Wikipedia, vedi qui .

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

Espandere le risposte che altri hanno dato:

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

I computer si occupano di numeri come i byte … saltando un po ‘di storia qui e ignorando i problemi di indirizzamento della memoria, i computer a 8 bit considerano un byte di 8 bit come la più grande unità numerica facilmente rappresentata sull’hardware, i computer a 16 bit si espandono quello a due byte e così via.

Le vecchie codifiche di caratteri come ASCII provengono dall’era (pre) a 8 bit e cercano di riempire il linguaggio dominante nel calcolo al momento, cioè l’inglese, in numeri che vanno da 0 a 127 (7 bit). Con 26 lettere dell’alfabeto, sia in forma maiuscola che in maiuscola, numeri e segni di punteggiatura, ha funzionato piuttosto 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 verrebbero mappati su caratteri diversi a seconda della lingua visualizzata. Gli standard ISO-8859 sono le forms più comuni di questa mapping; ISO-8859-1 e ISO-8859-15 (noto anche come ISO-Latin-1, latin1 e sì, esistono anche due versioni diverse dello standard ISO 8859).

Ma questo non è abbastanza quando si vogliono rappresentare personaggi di più di una lingua, quindi il fatto di racchiudere 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é il loro intervallo di valori è ancora limitato, 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 note per questo sono le codifiche UTF. Tutte le codifiche UTF funzionano all’incirca nello stesso modo: si sceglie una dimensione unitaria, 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 un personaggio completamente. Pertanto i caratteri più comuni (inglesi) occupano un solo byte in UTF-8 (due in UTF-16, 4 in UTF-32), ma altri caratteri della lingua possono occupare sei o più byte.

Le codifiche multi-byte (dovrei dire multi-unità dopo la spiegazione sopra) hanno il vantaggio di essere relativamente efficienti nello spazio, ma il lato negativo che operazioni come trovare sottostringhe, confronti, ecc. Devono decodificare i caratteri in codice unicode punti prima che tali operazioni possano essere eseguite (ci sono comunque delle scorciatoie).

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 i punti di codice Unicode. E questa è la tua relazione tra loro.

Windows gestisce le cosiddette stringhe “Unicode” come stringhe UTF-16, mentre la maggior parte degli UNIX è impostata su UTF-8 in questi giorni. I protocolli di comunicazione come HTTP tendono a funzionare meglio con UTF-8, poiché la dimensione dell’unità in UTF-8 è la stessa di ASCII e la maggior parte di tali protocolli è stata progettata nell’era ASCII. D’altra parte, UTF-16 offre la migliore prestazione media di spazio / elaborazione quando rappresenta tutte le lingue viventi.

Lo standard Unicode definisce un numero inferiore di punti codice che possono essere rappresentati in 32 bit. Pertanto, per tutti gli scopi pratici, UTF-32 e UCS4 sono diventati la stessa codifica, poiché è improbabile che si debbano trattare con caratteri multi-unit in UTF-32.

Spero che riempia alcuni dettagli.

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

UTF-8 è una codifica di 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 richiedono più byte a seconda del loro esatto punto di codice (fino a 4 byte per tutti i punti di codice attualmente definiti, cioè fino a U-0010FFFF, e infatti 4 byte potrebbero far fronte a U-001FFFFF).

Quando “Unicode” viene utilizzato come nome di una codifica di caratteri (ad esempio come proprietà .NET Encoding.Unicode ), in genere significa UTF-16 , che codifica i caratteri più comuni come due byte. Alcune piattaforms (in particolare .NET e Java) utilizzano UTF-16 come codifica dei caratteri “nativi”. Questo porta a problemi di peluria se devi preoccuparti dei caratteri 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 di questo, IME.

Alcuni riferimenti su Unicode:

  • Il sito web del consorzio Unicode e in particolare la sezione delle esercitazioni
  • L’articolo di Joel
  • Il mio articolo (orientato a .NET)

Consentitemi di usare un esempio per illustrare questo argomento:

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

Niente di magico finora, è molto semplice. Ora, diciamo che decidiamo di salvare questo personaggio sul nostro disco fisso. Per fare ciò, abbiamo bisogno di memorizzare il carattere in formato binario. Possiamo semplicemente memorizzarlo come è ‘01101100 01001001’. Fatto!

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 dire al computer di trattarlo come uno.

Qui è dove arrivano 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’, abbiamo bisogno di prefixare il nostro personaggio con alcune ‘intestazioni’. Il nostro carattere cinese è lungo 16 bit (conta il valore binario da solo), quindi utilizzeremo il formato sulla 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 un’unica riga:

 11100110 10110001 10001001 

Questo è il valore UTF-8 (binario) del carattere cinese! (confermalo: 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 

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 i punti di codice , ovvero un numero che rappresenta un carattere. Il modo in cui si memorizzano questi punti di codice nella memoria dipende dalla codifica che si sta 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 necessari per rappresentare praticamente tutte le lingue conosciute.

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

La codifica UTF-8 è un modo per rappresentare questi caratteri in modo digitale nella memoria del computer. UTF-8 associa ciascun punto di codice in una sequenza di ottetti (byte da 8 bit)

Ad esempio,

Carattere UCS = Carattere Unicode Han

Punto di codice UCS = U + 24B62

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

Unicode è solo uno standard che definisce un set di caratteri ( UCS ) e codifiche ( UTF ) per codificare questo set di caratteri. Ma in generale, Unicode si riferisce 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 (nessuna scusa!) 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 mappa i caratteri in codepoint.
Ogni personaggio ha un punto di codice univoco (numero di identificazione), che è un numero come 9731.

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

Ecco una lista ordinata con alcuni esempi casuali .

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,

Fecero uno standard chiamato “Unicode”.

Lo standard è come segue:

  • creare una forma in cui ogni posizione è chiamata “code point” o “code position”.
  • Le posizioni complessive vanno da U + 0000 a U + 10FFFF;
  • Fino ad ora, alcune posizioni sono piene di personaggi e altre posizioni sono salvate o vuote.
  • Ad esempio, la posizione “U + 0024” viene riempita con il carattere “$”.

PS: Naturalmente c’è un’altra organizzazione chiamata ISO che mantiene un altro standard – “ISO 10646”, quasi la stessa.

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

Sotto 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 parte di queste cose anche qui su Stack Overflow.

“… Alcune persone credono che Unicode sia semplicemente un codice a 16 bit in cui ogni carattere richiede 16 bit e quindi ci sono 65.536 possibili caratteri.” Questo non è, in realtà, corretto. È il singolo mito più comune su Unicode Quindi, se lo pensavi, non sentirti male.

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

Fino ad ora, abbiamo assunto che una lettera fosse mappata su alcuni bit che è ansible memorizzare su disco o in memoria:

A -> 0100 0001

In Unicode, una lettera si associa a qualcosa chiamato punto di codice che è ancora solo un concetto teorico. Il modo in cui quel punto di codice è rappresentato in memoria o su disco è tutta un’altra storia … ”

“… Ogni lettera platonica in ogni alfabeto viene assegnata ad un numero magico dal consorzio Unicode che è scritto in questo modo: U + 0639. Questo numero magico è chiamato punto codice, 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, era, hey, memorizziamo quei numeri in due byte ciascuno. Quindi Hello diventa

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

Destra? Non così in fretta! Potrebbe anche non essere:

48 00 65 00 6C 00 6C 00 6F 00? …”

Unicode è uno standard ad ampio spettro che definisce oltre 130.000 caratteri e assegna ciascuno un codice numerico (un “codepoint”). Definisce anche regole su come ordinare questo testo, normalizzarlo, cambiarne il caso e altro. Un carattere in Unicode è rappresentato da un punto di codice da zero fino a 0x10FFFF incluso, sebbene alcuni punti di codice siano riservati e non possano essere utilizzati per i caratteri.

I codici in Unicode possono essere rappresentati in più di una codifica. Il più semplice è UTF-32, che codifica semplicemente il punto di codice come numeri interi a 32 bit, con ciascuno di 4 byte di larghezza.

UTF-8 è un’altra codifica e rapidamente diventa lo standard di fatto. Codifica come una sequenza di valori di byte. Ogni punto di codice può utilizzare un numero variabile di questi byte. I punti di codice nel range ASCII sono codificati, 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 tenendo presenti queste proprietà:

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

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

  • I caratteri al di fuori dell’intervallo ASCII non utilizzano alcun byte nell’intervallo ASCII, assicurando che non possano essere scambiati per caratteri ASCII. Questa è anche una funzione di sicurezza.

  • UTF-8 può essere facilmente convalidato e distinto da altre codifiche di caratteri da un validatore. Il testo in altre codifiche a 8 bit o multi-byte molto raramente si convalida anche come UTF-8.

  • Accesso casuale: in qualsiasi punto della stringa UTF-8 è ansible dire se il byte in quella posizione è il primo byte di un personaggio o meno, e tornare indietro all’inizio di quel personaggio, senza bisogno di riferirsi a qualcosa a l’inizio della stringa.

Sono la stessa cosa, no?

No, non lo sono.


Penso che la prima frase della pagina di Wikipedia a cui fai riferimento dia un breve riassunto:

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

Elaborare:

  • Unicode è uno standard, che definisce una mappa da caratteri a numeri, i cosiddetti punti di codice , (come nell’esempio sotto). Per la mapping 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 un formato comprensibile da un computer, ovvero bit . In altre parole, è un modo / un 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 offre una spiegazione davvero bella e una panoramica della storia qui .

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

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