NAZWA
UTF-8 - zgodne z ASCII wielobajtowe kodowanie Unikodowe
OPIS
Zestaw znaków Unicode 3.0 zajmuje szesnastobitową przestrzeń kodową. Najprostsze kodowanie Unikodowe (znane jako UCS-2) składa się z sekwencji słów szesnastobitowych. Takie łańcuchy mogą zawierać jako część wielu znaków 16-bitowych bajty takie jak ’\0’ lub ’/’, które mają specjalne znaczenie w nazwach plików i innych parametrach funkcji z biblioteki C. Dodatkowo, większość narzędzi uniksowych spodziewa się plików ASCII i nie potrafi bez znacznych modyfikacji czytać słów 16-bitowych jako znaków. Z tych powodów UCS-2 nie jest pożądanym zewnętrznym kodowaniem Unicode w nazwach plików, plikach tekstowych, zmiennych środowiskowych itd. ISO 10646 Universal Character Set (UCS), nadzbiór Unicode, zajmuje nawet przestrzeń 31-bitową i oczywiste dlań kodowanie UCS-4 (sekwencja słów 32-bitowych) stwarza te same problemy.
Kodowanie UTF-8 dla Unicode i UCS nie ma tych problemów i jest słuszną metodą używania zestawu znaków Unicode w systemach operacyjnych wzorowanych na UNIX-ie.
WŁAŚCIWOŚCI
Kodowanie UTF-8 ma następujące przydatne
właściwości:
* |
UCS znaki od 0x00000000 do 0x0000007f (klasyczne znaki US-ASCII) zakodowane są po prostu jako bajty 0x00 do 0x7f (zgodność z ASCII). Oznacza to, że pliki i łańcuchy które zawierają tylko siedmiobitowe znaki ASCII mają takie samo kodowanie i w ASCII i w UTF-8. | ||
* |
Wszystkie znaki UCS > 0x7f zakodowane są jako wielobajtowy ciąg składający się tylko z bajtów w zakresie 0x80 do 0xfd, tak więc żadne bajty ASCII nie mogą się pojawić jako część innego znaku i nie występują tam problemy z np. ’\0’ czy ’/’. | ||
* |
Zachowany jest leksykograficzny porządek sortowania łańcuchów w UCS-4. | ||
* |
Za pomocą UTF-8 można zakodować wszystkie z możliwych 2^31 kodów UCS. | ||
* |
Bajty 0xc0, 0xc1, 0xfe i 0xff nie są nigdy używane w kodowaniu UTF-8. | ||
* |
Pierwszy bajt ciągu wielobajtowego reprezentującego pojedynczy znak UCS nie-ASCII zawsze zawiera się w zakresie 0xc2 do 0xfd i wskazuje jak długi jest ów ciąg. Wszystkie pozostałe bajty takiego wielobajtowego ciągu zawierają się w zakresie od 0x80 do 0xbf. Pozwala to na łatwą resynchronizację i sprawia, że kodowanie jest niezależne od stanu [systemu] oraz odporne na brakujące bajty. | ||
* |
Znaki UCS zakodowane w UTF-8 mogą mieć długość do sześciu bajtów, jakkolwiek standard Unicode nie definiuje znaków powyżej 0x10ffff, więc znaki Unicode mogą mieć maksymalnie cztery bajty w UTF-8. |
KODOWANIE
Do reprezentacji znaku używane są
następujące ciągi bajtów. Ciąg,
którego należy użyć zależy od
numeru kodu UCS znaku:
0x00000000 - 0x0000007F:
0xxxxxxx
0x00000080 - 0x000007FF:
110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF:
1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF:
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF:
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 - 0x7FFFFFFF:
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
The xxx bit positions are filled with the bits of the character code number in binary representation, most significant bit first (big-endian). Only the shortest possible multibyte sequence which can represent the code number of the character can be used.
The UCS code values 0xd800–0xdfff (UTF-16 surrogates) as well as 0xfffe and 0xffff (UCS noncharacters) should not appear in conforming UTF-8 streams. According to RFC 3629 no point above U+10FFFF should be used, which limits characters to four bytes.
PRZYKŁADY
Znak Unicode 0xa9 = 1010 1001 (znak copyright)
kodowany jest w UTF-8 jako
11000010 10101001 = 0xc2 0xa9
a znak 0x2260 = 0010 0010 0110 0000 (symbol "nie równa się") kodowany jest jako:
11100010 10001001 10100000 = 0xe2 0x89 0xa0
Uwagi o
stosowaniu
Aby włączyć obsługę locale
UTF-8 użytkownicy muszą wybrać na
przykład
export LANG=pl_PL.UTF-8
aby aktywować obsługę UTF-8 w aplikacjach.
Oprogramowanie, które musi wiedzieć, jakie kodowanie znaków jest używane powinno zawsze ustawiać locale, na przykład za pomocą
setlocale(LC_CTYPE, "")
a programiści mogą wówczas sprawdzać wartość wyrażenia
strcmp(nl_langinfo(CODESET), "UTF-8") == 0
aby określić, czy zostało wybrane locale UTF-8 i czy wszystko: standardowe wprowadzanie i wyprowadzanie danych otwartym tekstem, komunikacja terminalowa, zawartość plików tekstowych oraz zmienne środowiska, jest zakodowane w UTF-8.
Programiści przyzwyczajeni do jednobajtowego kodowania takiego, jak US-ASCII lub ISO 8859 muszą wiedzieć, że dwa z dotychczasowych założeń nie są spełnione w locale UTF-8. Po pierwsze, pojedynczy bajt niekoniecznie nadal odpowiada pojedynczemu znakowi. Po drugie, ponieważ nowoczesne emulatory terminali w trybie UTF-8 wspierają również chińskie, japońskie i koreańskie znaki o podwójnej długości, jak też nie rozdzielone znaki kombinowane, wyprowadzenie pojedynczego znaku niekoniecznie przesuwa kursor o jedną pozycję, jak to miało miejsce w ASCII. Do zliczania znaków i pozycji kursora należy obecnie używać funkcji bibliotecznych takich, jak mbsrtowcs(3) i wcswidth(3).
Oficjalną sekwencją unikową przełączającą ze schematu kodowania ISO 2022 (używaną na przykład przez terminale VT100) do UTF-8 jest ESC % G ("\x1b%G"). Odpowiadającą jej sekwencją powrotu z UTF-8 do ISO 2022 jest ESC % @ ("\x1b%@"). Inne sekwencje ISO 2022 (takie jak przełączające zbiory G0 i G1) nie mają zastosowania w trybie UTF-8.
BEZPIECZEŃSTWO
Standardy Unicode i UCS wymagają, aby
przy generowaniu UTF-8 używać
najkrótszej z możliwych postaci, np. generowanie
dwubajtowej sekwencji o pierwszym bajcie 0xc0 nie jest
zgodne ze standardem. Unicode 3.1 dodał
wymaganie, aby zgodne ze standardem programy nie
akceptowały innych niż najkrótsze postaci
jako swoich danych wejściowych. Jest to związane z
bezpieczeństwem: jeśli wprowadzane przez
użytkownika dane są sprawdzane pod kątem
możliwych naruszeń bezpieczeństwa, program
może sprawdzać jedynie wersje ASCII
wystąpień "/../", ";" lub NUL
i przeoczyć, że jest wiele niezgodnych z
ASCII sposobów przedstawienia tych rzeczy w
nienajkrótszym kodowaniu UTF-8.
STANDARDY
ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan
9.
ZOBACZ TAKŻE
locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7)
O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.07 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Gwidon S. Naskrent <naskrent [AT] hoth.pl>, Andrzej Krzysztofowicz <ankry [AT] green.pl> i Michał Kułach <michal.kulach [AT] gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres <manpages-pl-list [AT] lists.net>.