Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kodowanie UTF 8/16/32 w C++ - przechowywanie znaków

Ostatnio zmodyfikowano 2017-08-25 01:38
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Kodowanie UTF 8/16/32 w C++ - przechowywanie znaków
» 2017-08-22 23:03:43
Witam. Kodując znaki w ASCII wiemy, że mając tablicę char, każdy element tej tablicy może przechować jeden znak. Ale jak to jest zrobione, że możemy kodować w UTF - 8 gdzie znaki mogą być przechowywane w 1-6 bajtach (UTF 32 w 4 i UTF 16 w 2 lub 4). I jak właściwie komputer rozpoznaje, gdzie kończy się jeden znak a zaczyna drugi?
P-164212
Elaine
» 2017-08-22 23:13:46
P-164213
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-22 23:36:43
No tak, choć http://programowanie.opole.pl​/archives/2406 było napisane, że od 1 do 6 bitów, co w sumie jest głupotą, bo nie potrzeba więcej niż 4...
Ale jak w takim razie komputer alokuje na to pamięć (char czy wchar_t) oraz jak poruszać się po takich indeksach w tablicy (bo raz jeden znak jest zapisany na 4 bitach a raz na jednym)?

I jak to wygląda przy UTF-16 gdzie nie mamy czegoś takiego jak informacja, ile bajtów jest zajętych
P-164216
Kinexity
» 2017-08-22 23:52:30
Dzieje się wtedy magia zwana wyrównaniem. Możesz mieć znaki pozapisywane na odcinkach pamięci różnej długości, lecz jest to czasowo nieekonomiczne (pamięciowo tak ale w niewielkim stopniu, ponieważ albo masz dodatkowy odcinek pamięci, który przechowuje informację o długościach kolejnych znaków w pamięci, albo tracisz część układów bitów w krótszych znakach na rzecz przechowywania informacji o początku dłuższego znaku). Jeżeli masz np. UTF-32, to każdy znak będzie trzymany na 4B.
P-164218
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-23 01:03:32
To skoro i tak mamy wyrównanie przy kodowaniu UTF - 16 do 4 bajtów, to po co w ogóle bawienie się w jakieś algorytmy kodowania, zamiast używać po prostu UTF - 32, w który każdy znak = osobny kod, bez jakiś przekształceń i surogatów?
P-164226
Kinexity
» 2017-08-23 01:25:07
Zajrzyj na Wikipedię, do artykułu o UTF-16 i przeczytaj drugi akapit.
P-164228
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-23 01:30:01
Hmm... czyli po prostu siła wyższa, za mało pamięci :). W takim razie to wszystko czego chciałem się dowiedzieć. Dziękuje za odpowiedzi!
P-164230
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-23 02:24:13
Ale to jednak jeszcze nie wszystko!
Teraz już na pewno ostatnie:
Czytam o plikach binarnych i stąd narodziło się moje pytanie, mianowicie skąd komputer wie, czy 00 00 2A 00 jest liczbą, a nie znakiem o tym kodzie?
No i pojawia się zmienna typu short, a short zajmuje 2 bajty i tu domyślam się, że również występuje wyrównywanie do 4 bajtów, ale idźmy dalej. Mamy zmienną long long. Skąd
komputer wie, że to jest long long i zajmuje 8 bajtów, nie 4?

Widze, że przy odczytywaniu danych binarnych używamy
C/C++
int x = 0;
plik.read(( char * ) & x, sizeof x );
std::cout << x; // zrodlo: http://cpp0x.pl/artykuly/?id=72

I domyślałem się, że po prostu komputer "wie" co ile bajtów ma odczytywać dane, bo przesyłamy rozmiar typu, do którego mają być zapisywane. ALE! Co jeśli chcemy zapisać w tablicy char takie zdanie: Ala ma 2 koty

To czy liczba 2 (zapis binarny) nie jest czasami próbowana odczytać jako znak, w sensie nie jako liczba, ale jako znak kryjący się pod kodem 00 00 00 02?

 Gorzej, co jeśli ala ma tych kotów... sporo, np. 9'223'372'036'854'775'000 i tą liczbę już będzie ciężko wczytać, bo potrzebuje ona aż 8 bajtów, a my wczytujemy po 4 bajty (bo wczytujemy do tablicy char).

Uff... sporo tego. Sorki :V
P-164231
« 1 » 2 3
  Strona 1 z 3 Następna strona