UTF-8: Różnice pomiędzy wersjami
[wersja nieprzejrzana] | [wersja przejrzana] |
polskie znaki, linki zewnętrzne |
WP:SK, drobne redakcyjne |
||
Linia 1: | Linia 1: | ||
'''UTF-8''' – system kodowania [[Unicode]], wykorzystujący od 8 do 32 bitów do zakodowania pojedynczego znaku, w pełni kompatybilny z [[ASCII]]. |
|||
Nudny Utf-8 hehe :D |
|||
== Zalety i wady == |
== Zalety i wady == |
||
Linia 21: | Linia 21: | ||
Mapowanie znaków Unicode na ciągi bajtów: |
Mapowanie znaków Unicode na ciągi bajtów: |
||
<tt> |
<tt> |
||
* 0x00 do 0x7F |
* 0x00 do 0x7F – bity 0xxxxxxx, gdzie kolejne „x” to bity – licząc od najwyższego |
||
* 0x80 do 0x7FF |
* 0x80 do 0x7FF – bity 110xxxxx 10xxxxxx |
||
* 0x800 do 0xFFFF |
* 0x800 do 0xFFFF – bity 1110xxxx 10xxxxxx 10xxxxxx |
||
* 0x10000 do 0x1FFFFF |
* 0x10000 do 0x1FFFFF – bity 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
||
* 0x200000 do 0x3FFFFFF |
* 0x200000 do 0x3FFFFFF – bity 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
||
* 0x4000000 do 0x7FFFFFFF |
* 0x4000000 do 0x7FFFFFFF – bity 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
||
</tt> |
</tt> |
||
Znaki z przedziału ASCII (0 do 127) kodowane są jako jeden bajt, czyli m.in. litery alfabetu łacińskiego. Polskie [[znaki diakrytyczne]] kodowane już są jako dwa bajty. W listopadzie 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. |
Znaki z przedziału ASCII (0 do 127) kodowane są jako jeden bajt, czyli m.in. litery alfabetu łacińskiego. Polskie [[znaki diakrytyczne]] kodowane już są jako dwa bajty. W listopadzie 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]] <tt>/</tt> (ukośnik) można zapisać jako: |
Teoretycznie w UTF-8 ten sam znak można zapisać na kilka sposobów. Przykładowo znak [[ASCII]] <tt>/</tt> (ukośnik) można zapisać jako: |
||
<tt> |
<tt> |
||
: '''0'''0101111 |
: '''0'''0101111 |
||
: '''110'''00000 '''10'''101111 |
: '''110'''00000 '''10'''101111 |
||
: '''1110'''0000 '''10'''000000 '''10'''101111 |
: '''1110'''0000 '''10'''000000 '''10'''101111 |
||
</tt> |
</tt> |
||
: itd. |
: itd. |
||
Linia 43: | Linia 42: | ||
Problemu tego można byłoby uniknąć, przy okazji skracając nieznacznie wielkość danych, jeśli wykorzystano by zasadę przesunięć typu: |
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 |
* sekwencje 1-bajtowe kodują 0x80 różnych znaków – od 0x00 do 0x7F |
||
* sekwencje 2-bajtowe kodują 0x800 różnych znaków |
* sekwencje 2-bajtowe kodują 0x800 różnych znaków – od 0x80 do 0x87F |
||
* sekwencje 3-bajtowe kodują 0x10000 różnych znaków |
* sekwencje 3-bajtowe kodują 0x10000 różnych znaków – od 0x880 do 0x1087F |
||
* itd. |
* itd. |
||
Linia 54: | Linia 53: | ||
* [[UTF-32/UCS-4|UTF-32]] |
* [[UTF-32/UCS-4|UTF-32]] |
||
* [[:Kategoria:Kodowania znaków|Inne kodowania znaków]] |
* [[:Kategoria:Kodowania znaków|Inne kodowania znaków]] |
||
* [[Kodowanie polskich znaków|Kodowanie polskich znaków diakrytycznych w różnych standardach]] |
* [[Kodowanie polskich znaków|Kodowanie polskich znaków diakrytycznych w różnych standardach]] – tabela |
||
== Linki zewnętrzne == |
== Linki zewnętrzne == |
||
* [[Request for Comments|RFC]] 3629 |
* [[Request for Comments|RFC]] 3629 – zarys standardu ISO 10646, dotyczącego UTF-8 {{lang|en}} |
||
* [http://www.utf8-chartable.de/unicode-utf8-table.pl Tabela znaków w UTF-8] {{lang|en}} |
* [http://www.utf8-chartable.de/unicode-utf8-table.pl Tabela znaków w UTF-8] {{lang|en}} |
||
* [http://programowanie.opole.pl/archives/2406 UTF a Unicode] |
* [http://programowanie.opole.pl/archives/2406 UTF a Unicode] – objaśnienie różnicy między UTF i Unicode {{lang|pl}} |
||
[[Kategoria:Unicode]] |
[[Kategoria:Unicode]] |
Wersja z 12:41, 22 paź 2014
UTF-8 – system kodowania Unicode, wykorzystujący od 8 do 32 bitów do zakodowania pojedynczego znaku, w pełni kompatybilny z ASCII.
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 kodowane już są jako dwa bajty. W listopadzie 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ż
- Unicode
- UTF-7
- UTF-16
- UTF-32
- Inne kodowania znaków
- Kodowanie polskich znaków diakrytycznych w różnych standardach – tabela
Linki zewnętrzne
- RFC 3629 – zarys standardu ISO 10646, dotyczącego UTF-8 (ang.)
- Tabela znaków w UTF-8 (ang.)
- UTF a Unicode – objaśnienie różnicy między UTF i Unicode (pol.)