Kodowanie UTF-8

Jak tekst staje się bajtami

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 kodoweBajtyUkład bitów
U+0000 – U+007F10xxxxxxx
U+0080 – U+07FF2110xxxxx 10xxxxxx
U+0800 – U+FFFF31110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF411110xxx 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

Kierunek
Format bajtów
Przy dekodowaniu wpisz bajty w wybranym formacie (oddzielone spacją lub przecinkiem; encje HTML wyglądają jak Ä).

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.