Jeśli jesteś właścicielem tej strony, możesz wyłączyć reklamę poniżej zmieniając pakiet na PRO lub VIP w panelu naszego hostingu już od 4zł!

Str. główna i mapa serwisu, kodowanie Base64, kodowanie Quoted-Printable, kodowanie UTF-7, kodowanie UTF-16

Opis kodowania UTF-8

Kodowanie UTF-8 jest najpowszechniej stosowaną formą reprezentacji unikodu. Znaki ze zbioru US-ASCII są kodowane jako pojedyncze bity, inne znaki – jako dwa lub więcej bitów. Jest to kodowanie o zmiennej długości. Instrukcja dotyczy wyłącznie znaków z BMP.

Kodowanie

Każdy znak kodowany jest osobno, niezależnie od innych. Jako przykład zostaną użyte znaki ż i €.

  1. Numer unicode każdego znaku do zakodowania przedstawiamy w postaci binarnej (dla ułatwienia pokazany został pośredni etap postaci szesnastkowej) :
    ż → 017C → 00000001 01111100
    € → 20AC → 00100000 10101100
  2. Odrzucamy ewentualne wiodące zera:
    00000001 01111100 → 1 01111100
    00100000 10101100 → 100000 10101100
  3. Dzielimy postać binarną na grupy po sześć bajtów zaczynając od końca:
    0000000101111100 → 101 111100
    00100000 10101100 → 10 000010 101100
  4. Do każdej grupy z wyjątkiem pierwszej od lewej dopisujemy na początku 10, a do pierwszej grupy tyle jedynek, ile w sumie otrzymaliśmy grup (zwykle dwie lub trzy), zero, oraz tyle zer, by grupa ta liczyła osiem bitów:
    101 111100 → 11000101 10111100
    10 000010 101100 → 11100010 10000010 10101100
  5. Otrzymane ciągi binarne są reprezentacją UTF-8 kodowanych znaków. Można je przedstawić w postaci np. dziesiętnej lub szesnastkowej:
    11000101 10111100 → 197 188 → C5 BC
    11100010 10000010 10101100 → 226 130 172 → E2 82 AC

Uwaga: w przypadku znaków z zakresu unicode 800 – FFF (2048 – 4095) włącznie postać dwójkowa po usunięciu wiodących zer składa się z dwunastu bitów, co uniemożliwia zakodowanie ich jako dwóch grup. Dla tych znaków zostawia się jedno wiodące zero, a następnie koduje wg. powyższego algorytmu, np. znak o numerze 800 (2048):
800 → 00001000 00000000 → 01000 00000000 → 0 100000 000000 → 11100001 10000000 10000000 → E1 80 80

Ciekawostka: znaki o numerach 160 – 191 włącznie (A0 – BF), czyli pierwsze 32 znaki z górnego zakresu ISO-8859-1, w wyniku kodowania zostają zastąpione dwoma bajtami, z których pierwszy (starszy) to zawsze 11000010 (194, C2), a drugi (młodszy) jest identyczny, jak w charsecie ISO-8859-1.

W niektórych wypadkach, w celu zapewnienia automatycznego rozpoznania kodowania pliku jako UTF-8, na początku pliku może być wstawiony BOM, jednak normalnie BOM nie jest stosowany.

Dekodowanie

Dekodowanie jest czynnością odwrotną do kodowania. Trudność może sprawiać podzielenie zakodowanego ciągu na poszczególne znaki. W tym celu należy pamiętać, że każdy znak z US-ASCII nie jest kodowany (czyli np. a to a, 7 to 7 itd.), a w zakodowanych znakach pierwszy bajt zaczyna się zawsze od 110 lub 1110, zaś po nim następuje następny bajt (lub dwa bajty) zaczynający się (ew. oba zaczynające się) od10. Za przykład posłużą nam kody C5 BC i E2 82 AC

  1. Zakodowane ciągi przedstawiamy w postaci dwójkowej. Jeżeli liczba grup bajtów dla danego znaku jest większa od liczby wiodących jedynek w pierwszym bajcie, oznacza to, że kod jest nieważny, podobnie osamotnione bajty zaczynające się od 10 nie są ważnymi znakami:
    C5 BC → 11000101 10111100
    E2 82 AC → 11100010 10000010 10101100
  2. Z pierwszego bajtu usuwamy wszystkie wiodące jedynki i zera po nich następujące. Z drugiego i ew. trzeciego usuwamy tylko wiodące 10:
    11000101 10111100 → 101 111100
    11100010 10000010 10101100 → 10 000010 101100
  3. Otrzymane liczby binarne oznaczają numery znaków unicode. Można je przedstawić w bardziej dogodnej postaci (dziesiętnej, szesnastkowej):
    101 111100 → 380 → 017C → ż
    10 000010 101100 → 8364 → 20AC → €

Przyrost objętości

Pojedynczy znak w UTF-8 kodowany jest z użyciem jednego, dwóch lub trzech bajtów (zasada ta dotyczy tylko znaków z BMP, czyli Basic Multilingual Plane). Sumaryczny przyrost objętości w porównaniu z kodowaniem 8-bitowym zależy od zawartości znaków podlegających kodowaniu, przykładowy plik polski po konwersji z ISO-8859-2 na UTF-8 powiększył swoją objętość o niecałe 5%. W przypadku alfabetów nie opartych o alfabet łaciński przyrost objętości może wynosić teoretycznie do 200%.

licznik