Witam. Zacząłem uczyć się Javy, jednak nie do końca rozumiem, czym są jednostka kodująca i współrzędna kodowa znaku. Czy ktoś mógłby mi to przystępnie wyjaśnić?
Byłbym bardzo wdzięczny :))
Koziołek niestety ale nie znalazłem tam odpowiedzi na moje pytanie.
W dodatku chciałbym dopytać czym jest cytat "Dlaczego nie UTF-8? Ponieważ w kodowaniu tym jeden znak może mieć od 1 do 4 bajtów. Czyli krótko mówiąc aby dostac się do n-tego znaku nie możesz użyć najprostszego i najszybszego indeksowania, lecz musisz niesamowicie wolno (w porównaniu z indeksowaniem) parsować tekst sekwencyjnie." czym jest to prasowanie tekstu sekwencyjnie?
@Nazwa_użytkownika: to zacznijmy od podstaw. Znaki, litery, cyfry, glify, opisuje się za pomocą tzw. kodowania. Kodowania są różne i mają różną "pojemność". Jednym z kodowań jest UTF-8, które pozwala na zapisanie bardzo wielu różnych znaków. W przeciwieństwie do np. US-ASCII czy EBCDIC, które pozawalają na zapisanie 127 znaków w tym znaków sterujących np \0
(koniec pliku). Odbywa się to w następujący sposób.
Znaki są pogrupowane w zależności od ilości bajtów potrzebnych do ich zapisu. Minimum to 1 maksimum to 4 bajty. Mamy zatem już współrzędne kodowania - pierwszy bajt określa zakres, kolejne określają położenie na stronie. Ponad to każdy znak zaczyna się od odpowiedniej ilości bitów ustawionych na 1
, wyjątek stanowi pierwsze 128 znaków, które zaczynają się od 00
((szczegóły)[https://pl.wikipedia.org/wiki/UTF-8#Spos.C3.B3b_kodowania]). I tu dochodzimy do pytania o parsowanie tekstu. Jeżeli losowo wybierzesz dowolny bajt w tekście, to jesteś wstanie określić tylko, czy jest to początek znaku, jego środek czy jeden z 128 znaków pierwszej strony kodów. Działa to inaczej niż w przypadku US_ASCII, gdzie zawsze byłeś wstanie określić z jakim znakiem masz do czynienia.
Dzięki, już ogarniam :)
Tylko jeszcze jedna sprawa; Jak wiemy, jednostki z podstawowego zestawu BMP są kodowane za pomocą jednej jednostki kodowej (od U+0000 do U+FFFF oprócz obszaru surogatów ).
dlaczego znaki (4 - bajtowe) w utf-16 są kodowane jako "połączenie" dwóch jednostek kodowych (od U+D800 do U+DBFF i od U+DC00 do U+DFFF) zamiast np. od U+FFFF (koniec znaków z zestawu BMP) do 10FFFF(koniec zastawów wszystkich znaków) bez bawienia się w to łączenie jednostek kodowych.
czyli
U+0000 - U+FFFF - znaki BMP
U+10000 - U+10FFFF - znaki z innych zestawów
Dlaczego tak być nie może?
I ważne PS: dlaczego znaki 4 bajtowe są do 10FFFF skoro 10FFFF to dziesiętnie 1114111 a 4 bajty mają wartość 4294967295?
Odpowiedź na te pytania jest jedna. Ponieważ musisz przyjąć jakąś konwencję dla pierwszego bajtu w zapisie. Jeżeli będzie zaczynać się od 00
to wiadomo, że masz do czynienia ze znakiem z pierwszej grupy. Jeżeli będzie to 11
to wiadomo, że jest to bajt początkowy znaku wielo-bajtowego. Jeżeli jednak zaczyna się od 10
to wiadomo, że jest to któryś z kolejnych bajtów w znaku.
Kwestia założeń, które musisz przyjąć, tworząc kodowanie o zmiennej długości.
Dobra, dzięki wielkie, już wszystko wiem.