3. Kody alfanumeryczne

3.3. Unicode

W zapisie UTF-8 każdy znak UCS/Unicode jest przedstawiany w postaci sekwencji od jednego do sześciu 8-bitowych bajtów, zależnie od wartości samego znaku. Poniższa tabela obrazuje zasadę, na jakiej to się odbywa:

 

Liczba bajtów UTF-8 1. bajt 2. bajt 3. bajt 4. bajt Liczba bitów Unicode Maksymalna wartość  
            Hex Dec
1 0xxxxxxx       7 7F 127
2 110xxxxx 10xxxxxx     11 7FF 2047
3 1110xxxx 10xxxxxx 10xxxxxx   16 FFFF 65535
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 21 1FFFFF 2097151
5 111110xx 10xxxxxx itd.     26 3FFFFFF 67108863
6 1111110x 10xxxxxx itd.     31 7FFFFFFF 2147483647

 

Tab. 7. UTF-8

 

0xxxxxxx
10xxxxxx
110xxxxx
1110xxxx
11110xxx
111110xx
1111110x

: pierwszy i jedyny bajt sekwencji
: drugi i dalsze bajty sekwencji
 : pierwszy bajt sekwencji 2-bajtowej
: pierwszy bajt sekwencji 3-bajtowej
: pierwszy bajt sekwencji 4-bajtowej
: pierwszy bajt sekwencji 5-bajtowej
: pierwszy bajt sekwencji 6-bajtowej

Tab. 8. Znaczenie bajtu w zapisie UTF-8

W wielobajtowej sekwencji bity oznaczone 'x'-ami czytane od 1-szego, najstarszego bajtu tworzą właściwą wartość znaku UCS/Unicode. Z kolei wartość bieżącego bajtu wskazuje na jego miejsce w sekwencji UTF-8. W ten sposób zapis UTF-8 jest kompatybilny z 7-bitowym US-ASCII i zachowuje względną zwartość tekstów o niewielu znakach rozszerzonych, pozwalając jednocześnie na zapis nawet 31-bitowych wartości i na łatwą do realizacji synchronizację i interpretację przetwarzanych sekwencji.

Oto kilka przykładów 16-bitowych wartości Unicode w zapisie UTF-8:
Unicode UTF-8
Hex Hex
0001 01
007F 7F
0080 C2 80
07FF DF BF
0800 E0 A0 80
0FFF E0 BF BF
1000 E1 80 80
FFFF EF BF BF

 

Zapis UTF-8 jest nadmiarowy, bowiem np. wartościom 16-bitowym przyporządkowuje wartości 24-bitowe (3-bajtowe). W efekcie istnieje wiele ciągów bajtów, które nie są legalnymi sekwencjami UTF-8, nawet jeżeli wykonanie przekształcenia odwrotnego jest technicznie możliwe.

Ciąg bajtów C2 00 nie jest sekwencją UTF-8, ponieważ jego drugi bajt nie jest zgodny z wzorcem 10xxxxxx.
Ciąg bajtów C0 80 nie jest legalną sekwencją UTF-8, ponieważ jest dłuższy, niż trzeba: po zastosowaniu do niego maski binarnej 110xxxxx 10xxxxxx uzyskujemy wynik 00000 000000, czyli zerową wartość kodu, którą w UTF-8 zapisuje się poprawnie w jednym bajcie.
sekwencja C0 80 11000000 10000000
maska   110xxxxx 10xxxxxx
wynik 00 00000 000000

Oprócz zapisu UTF-8 spotyka się czasem UTF-7 wykorzystujący tylko 7 bitów używanego słowa oraz UTF-16 będący po prostu zapisem kolejnych kodów.

A oto reprezentacja polskich „ogonków” w Unicode:

ą 0105 Ą 0104
ć 0107 Ć 0106
ę 0119 Ę 0118
ł 0142 Ł 0141
ń 0144 Ń 0143
ó 00F3 Ó 00D3
ś 015B Ś 015A
ź 017A Ź 0179
ż 017C Ż 017B

 

Tab. 9. Polskie znaki w Unicode