Przejdź do zawartości

UTF-8

Z Wikipedii, wolnej encyklopedii
To jest stara wersja tej strony, edytowana przez 89.231.116.246 (dyskusja) o 09:29, 19 sty 2014. Może się ona znacząco różnić od aktualnej wersji.

UTF-8 – system kodowania Unicode.

Zalety i wady

Zalety

  • Każdy tekst w ASCII jest tekstem w UTF-8.
  • Żaden znak spoza ASCII nie zawiera bajtu z ASCII.
  • Zachowuje porządek sortowania UCS-4.
  • Typowy tekst ISO-Latin-X rozrasta się w bardzo niewielkim stopniu po przekonwertowaniu do UTF-8.
  • Nie zawiera bajtów 0xFF i 0xFE, więc łatwo można go odróżnić od tekstu UTF-16.
  • Znaki o kodzie różnym od 0 nie zawierają bajtu 0, co pozwala stosować UTF-8 w ciągach zakończonych zerem.
  • O każdym bajcie wiadomo, czy jest początkiem znaku, czy też leży w jego środku, co nie jest prawdą, np. w kodowaniu EUC.
  • Nie ma problemów z little endian vs. big endian.
  • Jest domyślnym kodowaniem w XML (również w jego aplikacjach: XHTML, SVG, XSL, CML, MathML).

Wady

  • Znaki CJK zajmują po 3 bajty zamiast 2 w kodowaniach narodowych.
  • Znaki alfabetów niełacińskich zajmują po 2 bajty zamiast jednego w kodowaniach narodowych.
  • UTF-8 nie używa przesunięć zasięgów, co stanowi dodatkowe utrudnienie dla implementacji UTF-8 (szczegóły poniżej)

Sposób kodowania

Mapowanie znaków Unicode na ciągi bajtów:

  • 0x00 do 0x7F            - bity 0xxxxxxx, gdzie kolejne "x" to bity - licząc od najwyższego
  • 0x80 do 0x7FF           - bity 110xxxxx 10xxxxxx
  • 0x800 do 0xFFFF         - bity 1110xxxx 10xxxxxx 10xxxxxx
  • 0x10000 do 0x1FFFFF     - bity 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 0x200000 do 0x3FFFFFF   - bity 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 0x4000000 do 0x7FFFFFFF - bity 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Znaki z przedziału ASCII (0 do 127) kodowane są jako jeden bajt, czyli m.in. litery alfabetu łacińskiego. Polskie znaki diakrytyczne kodowaje już są jako dwa bajty. W listopadnie 2003 roku kodowanie UTF-8 zostało ograniczone zgodnie z RFC 3629 do 0x10FFFF pozycji, w celu zapewnienia zgodności z ograniczeniami systemu UTF-16. Rezultatem jest usunięcie wszystkich sekwencji złożonych z 5 i 6 bajtów oraz około połowy sekwencji 4-bajtowych.


Teoretycznie w UTF-8 ten sam znak można zapisać na kilka sposobów. Przykładowo znak ASCII / (ukośnik) można zapisać jako:

00101111
11000000 10101111
11100000 10000000 10101111

itd.

Stanowi to zagrożenie bezpieczeństwa m.in. dla serwerów, które sprawdzają obecność znaku / w ścieżkach. Z tego powodu standard UTF-8 przewiduje, że poprawny jest wyłącznie najkrótszy możliwy sposób zapisu, a każdy program musi odrzucać znaki zapisane dłuższymi sekwencjami niż minimalna.

Problemu tego można byłoby uniknąć, przy okazji skracając nieznacznie wielkość danych, jeśli wykorzystano by zasadę przesunięć typu:

  • sekwencje 1-bajtowe kodują 0x80 różnych znaków - od 0x00 do 0x7F
  • sekwencje 2-bajtowe kodują 0x800 różnych znaków - od 0x80 do 0x87F
  • sekwencje 3-bajtowe kodują 0x10000 różnych znaków - od 0x880 do 0x1087F
  • itd.

Zobacz też

Linki zewnętrzne