Quanti caratteri possono codificare UTF-8?

Se UTF-8 è 8 bit, non significa che non ci può essere solo un massimo di 256 caratteri diversi?

I primi 128 punti di codice sono gli stessi di ASCII. Ma dice che UTF-8 può supportare fino a milioni di personaggi?

Come funziona?

UTF-8 non usa sempre un byte, è da 1 a 4 byte.

I primi 128 caratteri (US-ASCII) richiedono un byte.

I successivi 1.920 caratteri richiedono due byte per la codifica. Questo copre il resto di quasi tutti gli alfabeti latini, e anche alfabeti greci, cirillici, copti, armeni, ebraici, arabi, siriaci e tanani, oltre a combinare segni diacritici.

Sono necessari tre byte per i caratteri nel resto del piano multilingue di base, che contiene praticamente tutti i caratteri di uso comune [12], compresi i caratteri cinesi, giapponesi e coreani [CJK].

Sono necessari quattro byte per i caratteri negli altri piani di Unicode, che includono caratteri CJK meno comuni, vari script storici, simboli matematici ed emoji (simboli pittografici).

fonte: Wikipedia

UTF-8 utilizza 1-4 byte per carattere: un byte per caratteri ascii (i primi 128 valori unicode sono gli stessi di ascii). Ma questo richiede solo 7 bit. Se il bit più alto (“segno”) è impostato, questo indica l’inizio di una sequenza multi-byte; il numero di bit alti consecutivi impostati indica il numero di byte, quindi uno 0 e i bit rimanenti contribuiscono al valore. Per gli altri byte, i due bit più alti saranno 1 e 0 e i 6 bit rimanenti sono per il valore.

Quindi una sequenza di quattro byte inizia con 11110 … (… = tre byte per il valore) quindi tre byte con 6 bit ciascuno per il valore, ottenendo un valore di 21 bit. 2 ^ 21 supera il numero di caratteri Unicode, quindi tutti gli Unicode possono essere espressi in UTF8.

Secondo questa tabella * UTF-8 dovrebbe supportare:

2 31 = 2.147.483.648 caratteri

Tuttavia, RFC 3629 ha limitato i valori possibili, quindi ora siamo limitati a 4 byte , il che ci dà

2 21 = 2097.152 caratteri

Si noti che una buona parte di questi personaggi è “riservata” per l’uso personalizzato, che in realtà è piuttosto utile per i font di icone.

* Wikipedia usato mostra una tabella con 6 byte – da allora hanno aggiornato l’articolo.

2017-07-11: corretto per il conteggio doppio dello stesso punto di codice codificato con più byte

2.164.864 “caratteri” possono essere potenzialmente codificati da UTF-8.

Questo numero è 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21 che deriva dal modo in cui funziona la codifica:

  • I caratteri a 1 byte hanno 7 bit per la codifica 0xxxxxxx (0x00-0x7F)

  • I caratteri a 2 byte hanno 11 bit per la codifica 110xxxxx 10xxxxxx (0xC0-0xDF per il primo byte, 0x80-0xBF per il secondo)

  • I caratteri a 3 byte hanno 16 bit per la codifica 1110xxxx 10xxxxxx 10xxxxxx (0xE0-0xEF per il primo byte, 0x80-0xBF per byte di continuazione)

  • I caratteri a 4 byte hanno 21 bit per la codifica 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (0xF0-0xF7 per il primo byte, 0x80-0xBF per byte di continuazione)

Come puoi vedere, questo è significativamente più grande dell’attuale Unicode (1.112.064 caratteri).

Unicode vs UTF-8

Unicode risolve i punti di codice in caratteri. UTF-8 è un meccanismo di archiviazione per Unicode. Unicode ha una specifica. UTF-8 ha una specifica. Entrambi hanno limiti diversi. UTF-8 ha un diverso verso l’alto.

Unicode

Unicode è designato con “piani”. Ogni piano porta 2 16 punti di codice. Ci sono 17 piani in Unicode. Per un totale di 17 * 2^16 punti di codice. Il primo piano, il piano 0 o il BMP , è speciale nel peso di ciò che trasporta.

Piuttosto che spiegare tutte le sfumature, lasciatemi solo citare l’articolo precedente sugli aerei.

I 17 piani possono ospitare 1,114,112 punti codice. Di questi, 2048 sono surrogati, 66 sono non-caratteri e 137.468 sono riservati per uso privato, lasciando 974.530 per l’incarico pubblico.

UTF-8

Ora torniamo all’articolo collegato sopra,

Lo schema di codifica utilizzato da UTF-8 è stato progettato con un limite molto più grande di 2 31 punti di codice (32.768 piani) e può codificare 2 21 punti di codice (32 piani) anche se limitato a 4 byte. [3] Poiché Unicode limita il codice punta ai 17 piani che possono essere codificati da UTF-16, i punti di codice sopra 0x10FFFF non sono validi in UTF-8 e UTF-32.

Quindi puoi vedere che puoi inserire cose in UTF-8 che non è Unicode valido. Perché? Perché UTF-8 ospita punti di codice che Unicode non supporta nemmeno.

UTF-8, anche con una limitazione di quattro byte, supporta 2 21 punti di codice, che è molto più di 17 * 2^16

UTF-8 è una codifica a lunghezza variabile con un minimo di 8 bit per carattere.
I personaggi con punti di codice più alti occuperanno fino a 32 bit.

Citazione da Wikipedia: “UTF-8 codifica ciascuno dei 1.112.064 punti di codice nel set di caratteri Unicode utilizzando da uno a quattro byte da 8 bit (chiamati” ottetti “nello standard Unicode).”

Alcuni link:

Controlla lo standard Unicode e le informazioni correlate, ad esempio la relativa voce delle domande frequenti, UTF-8 UTF-16, UTF-32 e BOM . Non è una navigazione agevole, ma è un’informazione autorevole, e gran parte di ciò che potresti leggere su UTF-8 altrove è discutibile.

“8” in “UTF-8” si riferisce alla lunghezza delle unità di codice in bit. Le unità di codice sono quadro utilizzate per codificare i caratteri, non necessariamente come una semplice mapping uno a uno. UTF-8 utilizza un numero variabile di unità di codice per codificare un carattere.

La raccolta di caratteri che possono essere codificati in UTF-8 è esattamente la stessa di UTF-16 o UTF-32, ovvero tutti i caratteri Unicode. Tutti codificano l’intero spazio di codifica Unicode, che include anche caratteri non assegnati e punti codice non assegnati.

Mentre sono d’accordo con mpen sui codici UTF-8 attuali massimi (2,164,864) (elencati di seguito, non posso commentare i suoi), è fuori da 2 livelli se rimuovi le 2 principali restrizioni di UTF-8: solo 4 byte il limite e i codici 254 e 255 non possono essere utilizzati (ha solo rimosso il limite di 4 byte).

Il codice di avvio 254 segue la disposizione di base dei bit di partenza (flag multi-bit impostato su 1, un conteggio di 6 1 e terminale 0, nessun bit di riserva) fornendo 6 byte aggiuntivi con cui lavorare (6 gruppi 10xxxxxx, un ulteriore 2 ^ 36 codici).

Il codice di partenza 255 non segue esattamente l’impostazione di base, nessun terminale 0 ma tutti i bit vengono utilizzati, fornendo 7 byte aggiuntivi (flag multi-bit impostato su 1, un conteggio di 7 1 e nessun terminale 0 perché tutti i bit sono utilizzati ; 7 gruppi 10xxxxxx, altri 2 ^ 42 codici).

Aggiungendo questi in un set di caratteri presentabile massimo finale di 4.468.982.745.216. Questo è più di tutti i personaggi in uso corrente, lingue vecchie o morte e qualsiasi lingua ritenuta persa. Sceneggiatura angelica o celeste chiunque?

Inoltre ci sono codici a byte singolo che vengono trascurati / ignorati nello standard UTF-8 oltre a 254 e 255: 128-191 e pochi altri. Alcuni sono usati localmente dalla tastiera, il codice di esempio 128 di solito è un backspace di cancellazione. Gli altri codici di avviamento (e gli intervalli associati) non sono validi per uno o più motivi ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).