Il numero equivalente in formato decimale è 200.
In formato binario è 11001000.
UTF-8 codifica i caratteri con un numero variabile di byte da 1 a 4.
I bit iniziali (fissi) di ogni byte indicano la natura di ogni singolo byte:
| Num. byte | byte 1 | byte 2 | byte 3 | byte 4 | Spazi liberi |
| 1 | 0....... | 7 | |||
| 2 | 110..... | 10...... | 11 | ||
| 3 | 1110.... | 10...... | 10...... | 16 | |
| 4 | 11110... | 10...... | 10...... | 10...... | 21 |
Bit iniziale 0: il byte, da solo, codifica un carattere; i byte di questo tipo corrispondono a quelli della codifica ASCII.
Bit iniziali 110: il byte è il primo di un gruppo di byte che codifica un carattere con 2 byte.
Bit iniziali 1110: il byte è il primo di un gruppo di byte che codifica un carattere con 3 byte.
Bit iniziali 11110: il byte è il primo di un gruppo di byte che codifica un carattere con 4 byte.
Bit iniziali 10: il byte appartiene a un gruppo (di 2, 3, 4 byte), ma non è il primo byte del gruppo. I byte di questo tipo vengono chiamati "di continuazione".
Con i puntini ho rappresentato gli spazi liberi in ogni byte. Questi spazi sono destinati a ospitare i bit del Code Point Unicode.
Abbiamo visto che Unicode associa alla È il numero binario 11001000, formato da 8 bit.
Un singolo byte ha solo 7 spazi liberi, quindi non è sufficiente a contenere 8 bit.
Una coppia di byte ha 11 spazi liberi, quindi è adatto allo scopo.
I bit di 11001000 vengono inseriti negli spazi liberi di 110..... 10...... procedendo da destra verso sinistra:
110...11 10001000
I 3 spazi liberi non utilizzati, nel primo byte, vengono riempiti con zeri:
11000011 10001000
11000011 = 195 decimale.
10001000 = 136 decimale.
Quindi in una stringa o in un file di testo UTF-8 la coppia di byte 195, 136 rappresenta la lettera È.
| Vocale | CP esa | CP dec | CP bin | Byte 1 | Byte 2 |
| À (A grave) | C0 | 192 | 11000000 | 11000011 (195) | 10000000 (128) |
| Á (A acuto) | C1 | 193 | 11000001 | 11000011 (195) | 10000001 (129) |
| È (E grave) | C8 | 200 | 11001000 | 11000011 (195) | 10001000 (136) |
| É (E acuto) | C9 | 201 | 11001001 | 11000011 (195) | 10001001 (137) |
| Ì (I grave) | CC | 204 | 11001100 | 11000011 (195) | 10001100 (140) |
| Í (I acuto) | CD | 205 | 11001101 | 11000011 (195) | 10001101 (141) |
| Ò (O grave) | D2 | 210 | 11010010 | 11000011 (195) | 10010010 (146) |
| Ó (O acuto) | D3 | 211 | 11010011 | 11000011 (195) | 10010011 (147) |
| Ù (U grave) | D9 | 217 | 11011001 | 11000011 (195) | 10011001 (153) |
| Ú (U acuto) | DA | 218 | 11011010 | 11000011 (195) | 10011010 (154) |
| à (a grave) | E0 | 224 | 11100000 | 11000011 (195) | 10100000 (160) |
| á (a acuto) | E1 | 225 | 11100001 | 11000011 (195) | 10100001 (161) |
| è (e grave) | E8 | 232 | 11101000 | 11000011 (195) | 10101000 (168) |
| é (e acuto) | E9 | 233 | 11101001 | 11000011 (195) | 10101001 (169) |
| ì (i grave) | EC | 236 | 11101100 | 11000011 (195) | 10101100 (172) |
| í (i acuto) | ED | 237 | 11101101 | 11000011 (195) | 10101101 (173) |
| ò (o grave) | F2 | 242 | 11110010 | 11000011 (195) | 10110010 (178) |
| ó (o acuto) | F3 | 243 | 11110011 | 11000011 (195) | 10110011 (179) |
| ù (u grave) | F9 | 249 | 11111001 | 11000011 (195) | 10111001 (185) |
| ú (u acuto) | FA | 250 | 11111010 | 11000011 (195) | 10111010 (186) |
Un singolo byte ha 7 spazi liberi, che possono rappresentare 27 (128) valori appartenenti all'intervallo 0-127 (0-7F).
2 byte hanno 11 spazi liberi, che possono rappresentare 211 (2048) valori appartenenti all'intervallo 0-2047 (0-7FF).
3 byte hanno 16 spazi liberi, che possono rappresentare 216 (65536) valori appartenenti all'intervallo 0-65535 (0-FFFF).
4 byte hanno 21 spazi liberi, che possono rappresentare 221 (2097152) valori appartenenti all'intervallo 0-2097151 (0-1FFFFF)
Questo permette di calcolare, per ogni Code Point, il numero di byte necessari per la codifica UTF-8:
CP intervallo 0-127 (0-7F): codifica con un byte;
CP intervallo 128-2047 (80-7FF): codifica con 2 byte;
CP intervallo 2048-65535 (800-FFFF): codifica con 3 byte;
CP intervallo 65536-2097151 (10000-1FFFFF): codifica con 4 byte.
La capienza è teorica, perché non tutti i valori possibili sono utilizzabili.
Un gruppo di 3 byte contiene 16 spazi liberi:
1110.... 10...... 10......
Anche questo gruppo può contenere il byte 11001000 (È):
1110.... 10....11 10001000
11100000 10000011 10001000
I 3 byte, in formato decimale, sono 224, 131, 136.
Le regole UTF-8 vietano l'utilizzo di codifiche siffatte.
Bisogna usare il minimo numero di byte possibile, in questo caso 2.
Le codifiche overlong sono vietate perché implicano:
spreco di memoria;
violazione della corrispondenza biunivoca fra caratteri e codifiche;
problemi di sicurezza.
Programmi diversi possono avere diversi comportamenti, quando si trovano a gestire stringhe e file con codifiche overlong.
www.corradodamiano.it