UTF-8 to kodowanie znaków używane dziś przez niemal wszystkie strony internetowe, formaty plików i protokoły sieciowe. Każdy znak Unicode zapisuje jako od jednego do czterech bajtów, a zwykły tekst ASCII pozostaje bez zmian.
Zamień tekst na UTF-8 online ↓
Unicode i kodowania
Unicode przypisuje każdemu znakowi liczbę, tzw. punkt kodowy: A to U+0041, ł to U+0142, € to U+20AC, a emoji 😀 to U+1F600. Kodowanie określa, jak te liczby zapisać w bajtach. Najpopularniejszym kodowaniem jest UTF-8, opracowane przez Kena Thompsona i Roba Pike’a w 1992 roku; inne to UTF-16 i UTF-32.
Jak działa UTF-8
Liczba bajtów zależy od wielkości punktu kodowego. Pierwszy bajt informuje, ile bajtów następuje po nim; każdy kolejny bajt zaczyna się od bitów 10:
| Punkty kodowe | Bajty | Układ bitów |
|---|---|---|
| U+0000 – U+007F | 1 | 0xxxxxxx |
| U+0080 – U+07FF | 2 | 110xxxxx 10xxxxxx |
| U+0800 – U+FFFF | 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| U+10000 – U+10FFFF | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Na przykład ł (U+0142, binarnie 101 0100 0010) wymaga dwóch bajtów: bity dzieli się na 00101 i 000010, co daje 11000101 10000010, czyli szesnastkowo C5 82. Znak euro to E2 82 AC, a 😀 to F0 9F 98 80.
Dlaczego UTF-8 wygrało
- Zgodność z ASCII: tekst angielski i kod źródłowy wyglądają tak samo jak w ASCII.
- Samosynchronizacja: z dowolnego miejsca można znaleźć początek następnego znaku, bo bajty kontynuacji zawsze zaczynają się od 10.
- Brak problemu kolejności bajtów: w przeciwieństwie do UTF-16, UTF-8 to ciąg pojedynczych bajtów, więc znacznik BOM nie jest potrzebny.
Nie każdy ciąg bajtów jest poprawnym UTF-8. Dekoder musi odrzucić np. samotny bajt kontynuacji, urwaną sekwencję lub zapis „nadmiarowy” (np. C0 AF zamiast /). Akceptowanie zapisów nadmiarowych prowadziło do prawdziwych luk bezpieczeństwa, bo filtry szukające / lub .. ich nie rozpoznawały.
Konwerter UTF-8
Ä).
UTF-8 w praktyce
Strony HTML deklarują kodowanie znacznikiem <meta charset="utf-8">. W JavaScripcie new TextEncoder().encode(text) zwraca bajty UTF-8 tekstu, a new TextDecoder('utf-8', { fatal: true }) je dekoduje i zgłasza błąd przy niepoprawnych danych – tak działa narzędzie powyżej. W Pythonie służą do tego text.encode('utf-8') i data.decode('utf-8').
Kodowanie ma znaczenie także w kryptografii: szyfry i funkcje skrótu działają na bajtach, a nie na znakach, więc ten sam tekst zakodowany inaczej da inny szyfrogram lub skrót. Zobacz też liczby binarne i zapis liczb.