UTF-8
Z Wikipedii
UTF-8 - system kodowania Unicodu.
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
- RFC 3629 - UTF-8, a transformation format of ISO 10646