utf-8

UTF-8(7)                 Podręcznik programisty Linuksa                 UTF-8(7)



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.08 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@hoth.amu.edu.pl>, Andrzej Krzysztofowicz
       <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@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@lists.sourceforge.net>.



GNU                              6 marca 2019 r.                        UTF-8(7)