NAZWA
UTF-8 - zgodne z ASCII wielobajtowe kodowanie UnikodoweOPIS
The Unicode 3.0 character set occupies a 16-bit code space. The most obvious Unicode encoding (known as UCS-2) consists of a sequence of 16-bit words. Such strings can contain—as part of many 16-bit characters—bytes such as '\0' or '/', which have a special meaning in filenames and other C library function arguments. In addition, the majority of UNIX tools expect ASCII files and can't read 16-bit words as characters without major modifications. For these reasons, UCS-2 is not a suitable external encoding of Unicode in filenames, text files, environment variables, and so on. The ISO 10646 Universal Character Set (UCS), a superset of Unicode, occupies an even larger code space—31 bits—and the obvious UCS-4 encoding for it (a sequence of 32-bit words) has the same problems. 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.
- *
- All UCS characters greater than 0x7f are encoded as a multibyte sequence consisting only of bytes in the range 0x80 to 0xfd, so no ASCII byte can appear as part of another character and there are no problems with, for example, '\0' or '/'.
- *
- Zachowany jest leksykograficzny porządek sortowania łańcuchów w UCS-4.
- *
- All possible 2^31 UCS codes can be encoded using UTF-8.
- *
- 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 10 xxxxxx
- 0x04000000 - 0x7FFFFFFF:
- 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10 xxxxxx 10xxxxxx
PRZYKŁADY
Znak Unicode 0xa9 = 1010 1001 (znak copyright) kodowany jest w UTF-8 jako11000010 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ładexport 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
to determine whether a UTF-8 locale has been selected and whether therefore all
plaintext standard input and output, terminal communication, plaintext file
content, filenames, and environment variables are encoded in 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)TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Gwidon S. Naskrent <[email protected]>, Andrzej Krzysztofowicz <[email protected]> i Michał Kułach <[email protected]> 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 listy dyskusyjnej [email protected]10 lutego 2023 r. | Linux man-pages 6.03 |