Przejdź do zawartości

UTF-8: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
[wersja przejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
Zalety: ort.
Znacznik: Wycofane
Linia 3: Linia 3:


== Zalety i wady ==
== Zalety i wady ==

=== Zalety ===
506f7274616c2055726c20687474703a2f2f323174762e6e65743a383738392f632f0a21cc5265616c2055726c20687474703a2f2f323174762e6e65743a383738392f632f0a21cc5479706520506f7274616c2020706f7274616c2e7068700a21cc4d61632030303a31413a37393a30303a30303a30310a21cc45787069726174696f6e204a616e756172792031342c20323032352c20393a353820706d2031333820446179730a21cc4d61632053746174757320d4e5db01d4e5dafbd4e5daf92cbc20d4e5db00d4e5daf9d4e5daf7d4e5dafad4e5daeed4e5daf6d4e5daf0d4e5daef202cbdd4eddc920a21cc4d3375202173217420216e2172fabe2166216c216a20d4edd98b0a21cc56706e204e6f20436c69656e7420495020416464726573730a21cc5219b7-ee-e619bf-dc20546865204e65746865726c616e647320d4ecdaa3d4ecdaa10a222021b04b61426f6f6dd4edd95b556c74696d612019ee19ef19e119e919e519f119e9200a0a221d21b02053657269616c2033303646354244383244373230333732353044373432383136423134393945342020200a21cc53657269616c43757420333036463542443832443732300a21cc44657669636549443120443230413330353531333938443238423130424633363736453444323434324432343432463841333938453432424142374632303333313335393438393142360a21cc44657669636549443220313538383136433238343244314241353632324333304335364344364644383031413638444138384136303736363634333344364137424543433338423938410a21cc5369676e617475726520373834434644433532383938393532344235373943353233413538433135414139433945333942443332374244313937324545363542333344444130303439460a222021b0200a221d21b04d3375205265616c2055526c20687474703a2f2f323174762e6e65743a383738392f6765742e7068703f757365726e616d653d706c61792670617373776f72643d6c6976652e7068703f6d61633d30303a31413a37393a30303a30303a30312673747265616d3d35303335353326657874656e73696f6e3d747326747970653d6d33755f706c7573266f75747075743d6d3375380a222021b04d337520486f73742055726c20687474703a2f2f323174762e6e65743a383738392f6765742e7068703f757365726e616d653d706c61792670617373776f72643d6c6976652e7068703f6d61633d30303a31413a37393a30303a30303a30312673747265616d3d35303335353326657874656e73696f6e3d747326747970653d6d33755f706c7573266f75747075743d6d33753820200a221d21b04348414e4e454c53
* Każdy tekst w [[ASCII]] jest tekstem w UTF-8.
* Żaden znak spoza ASCII nie zawiera bajtu z ASCII.
* Zachowuje porządek sortowania [[UTF-32/UCS-4|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 dostępne np. w kodowaniu [[EUC]].
* Nie ma problemów z [[Kolejność bajtów|little endian]] vs [[Kolejność bajtów|big endian]].
* Jest domyślnym kodowaniem w XML (również w jego aplikacjach: [[XHTML]], [[Scalable Vector Graphics|SVG]], [[Extensible Stylesheet Language|XSL]], [[Chemical Markup Language|CML]], [[MathML]]).


=== Wady ===
=== Wady ===

Wersja z 12:40, 30 sie 2024

UTF-8 (ang. 8-bit Unicode Transformation Format) – system kodowania Unicode, wykorzystujący od 1 do 4 bajtów do zakodowania pojedynczego znaku, w pełni kompatybilny z ASCII. Jest najczęściej wykorzystywany do przechowywania napisów w plikach i komunikacji sieciowej.

Zalety i wady

506f7274616c2055726c20687474703a2f2f323174762e6e65743a383738392f632f0a21cc5265616c2055726c20687474703a2f2f323174762e6e65743a383738392f632f0a21cc5479706520506f7274616c2020706f7274616c2e7068700a21cc4d61632030303a31413a37393a30303a30303a30310a21cc45787069726174696f6e204a616e756172792031342c20323032352c20393a353820706d2031333820446179730a21cc4d61632053746174757320d4e5db01d4e5dafbd4e5daf92cbc20d4e5db00d4e5daf9d4e5daf7d4e5dafad4e5daeed4e5daf6d4e5daf0d4e5daef202cbdd4eddc920a21cc4d3375202173217420216e2172fabe2166216c216a20d4edd98b0a21cc56706e204e6f20436c69656e7420495020416464726573730a21cc5219b7-ee-e619bf-dc20546865204e65746865726c616e647320d4ecdaa3d4ecdaa10a222021b04b61426f6f6dd4edd95b556c74696d612019ee19ef19e119e919e519f119e9200a0a221d21b02053657269616c2033303646354244383244373230333732353044373432383136423134393945342020200a21cc53657269616c43757420333036463542443832443732300a21cc44657669636549443120443230413330353531333938443238423130424633363736453444323434324432343432463841333938453432424142374632303333313335393438393142360a21cc44657669636549443220313538383136433238343244314241353632324333304335364344364644383031413638444138384136303736363634333344364137424543433338423938410a21cc5369676e617475726520373834434644433532383938393532344235373943353233413538433135414139433945333942443332374244313937324545363542333344444130303439460a222021b0200a221d21b04d3375205265616c2055526c20687474703a2f2f323174762e6e65743a383738392f6765742e7068703f757365726e616d653d706c61792670617373776f72643d6c6976652e7068703f6d61633d30303a31413a37393a30303a30303a30312673747265616d3d35303335353326657874656e73696f6e3d747326747970653d6d33755f706c7573266f75747075743d6d3375380a222021b04d337520486f73742055726c20687474703a2f2f323174762e6e65743a383738392f6765742e7068703f757365726e616d653d706c61792670617373776f72643d6c6976652e7068703f6d61633d30303a31413a37393a30303a30303a30312673747265616d3d35303335353326657874656e73696f6e3d747326747970653d6d33755f706c7573266f75747075743d6d33753820200a221d21b04348414e4e454c53

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 możliwe jest na jeden z czterech sposobów:

  • U+00 do U+7F       0xxxxxxx, gdzie kolejne „x” to bity od najstarszego,
  • U+80 do U+7FF      110xxxxx 10xxxxxx,
  • U+800 do U+FFFF    1110xxxx 10xxxxxx 10xxxxxx,
  • U+10000 do U+10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.

Znaki z przedziału ASCII (0 do 127) kodowane są jako jeden bajt, czyli m.in. litery alfabetu łacińskiego. Polskie litery diakrytyzowane kodowane już są jako dwa bajty.

W listopadzie 2003 roku kodowanie UTF-8 zostało ograniczone zgodnie z RFC 3629 ↓, w celu zapewnienia zgodności z ograniczeniami kodowania UTF-16. Po pierwsze ograniczono maksymalny kod do U+10FFFF. Wcześniej wynosił on U+7FFFFFFF, dopuszczalne były sekwencje złożone z 5 i 6 bajtów, a 4-bajtowe mogły kodować znaki do U+1FFFFF. Po drugie zabroniono kodów z zakresu od U+D800 do U+DFFF, co pomniejszyło liczbę dopuszczalnych kodów o dodatkowe 2048. W ten sposób pozostało dokładnie 17 · 65536 − 2048 kodów, co oznacza że w UTF-8 można zakodować 1 112 064 różnych znaków.

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

  • 00101111,
  • 11000000 10101111,
  • 11100000 10000000 10101111,
  • 11110000 10000000 10000000 10101111.

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.

Przykład

Kodowanie na podstawie znaku euro :

  1. Znak € w Unicode ma oznaczenie U+20AC.
  2. Zgodnie z informacjami w poprzednim podrozdziale taka wartość jest możliwa do zakodowania na 3 bajtach.
  3. Liczba szesnastkowa 20AC to binarnie 0010 0000 1010 1100 po uzupełnieniu wiodącymi zerami do 16 bitów, ponieważ tyle bitów trzeba zakodować na 3 bajtach w UTF-8.
  4. Kodowanie na trzech bajtach wymaga użycia w pierwszym bajcie trzech wiodących bitów ustawionych na 1, a czwartego na 0 (1110).
  5. Pozostałe bity pierwszego bajtu pochodzą z najstarszych czterech bitów kodowanej wartości w Unicode, co daje (1110 0010), a reszta bitów dzielona jest na dwa bloki po 6 bitów każdy (0000 1010 1100).
  6. Do tych bloków dodawane są wiodące bity 10, by tworzyły następujące 8-bitowe wartości 1000 0010 i 1010 1100).
  7. W ten sposób rezultatem są trzy bajty w postaci 1110 0010 1000 0010 1010 1100, co w systemie szesnastkowych przyjmuje postać E2 82 AC.

Poniższa tabela pozwala zrozumieć sposób kodowana różnej długości numerów kodowych Unicode w UTF-8.

Unicode Unicode binarnie UTF-8 binarnie
 1. bajt   2. bajt   3. bajt   4. bajt
UTF-8 szesnastkowo
$ U+0024 0100100 00100100 24
¢ U+00A2 000 10100010 11000010 10100010 C2 A2
U+20AC 00100000 10101100 11100010 10000010 10101100 E2 82 AC
𐍈 U+10348 00001 00000011 01001000 11110000 10010000 10001101 10001000 F0 90 8D 88

Zobacz też

Linki zewnętrzne