UTF-8 - system kodowania Unikodu.

Spis treści

edytuj 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.
  • 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.

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.
  • Obecnie (2007 rok) wiÄ™kszość zastosowaÅ„ w Internecie (poczta elektroniczna, usenet, HTML) wymaga deklarowania UTF-8 zgodnie ze standardem MIME. Dopiero w XHTML UTF-8 jest kodowaniem domyÅ›lnym.
  • UTF-8 nie używa przesunięć zasiÄ™gów, co stanowi dodatkowe utrudnienie dla implementacji UTF-8 (szczegóły poniżej)

edytuj Sposób kodowania

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

  • 0x00 do 0x7f - bity 0xxxxxxx, gdzie iksy to bity od najwyższego liczÄ…c
  • 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

Niestety oznacza to, że 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.

Standard UTF-8 przewiduje, że każdy program MUSI odrzucać wszystkie znaki zapisane sekwencjami dłuższymi niż minimalna.

Problemu tego można byłoby uniknąć, przy okazji skracając nieznacznie długość 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.

edytuj Zobacz też

edytuj Linki zewnętrzne