• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak dokonać odkodowania znaków Unicode zapisanych w formacie UTF-8?

Object Storage Arubacloud
0 głosów
565 wizyt
pytanie zadane 22 czerwca 2021 w C i C++ przez rottingham Nowicjusz (140 p.)
Cześć Wszystkim!

Chciałbym w języku C napisać program, który odczyta plik i wypisze na ekran zawartość tego pliku, ale w postaci poszczególnych kodów Unicode. Zależy mi, żeby wypisał te kody typowo w formacie U+00000. Umiem wypisać w postaci szesnastkowej numery bajtów poszczególnych znaków w systemie UTF-8. Ale jak mogę to zamienić na numer Unicode? Teoretycznie na kartce umiem to przekształcić, ale nie wiem, jak "dobrać" się do tych liczb w programie. Da się dostać do tych cyfr bezpośrednio w formie binarnej? I zliczać po kolei konkretne bity i na tej podstawie zdekodować numer unicode?

2 odpowiedzi

+1 głos
odpowiedź 23 czerwca 2021 przez j23 Mędrzec (194,920 p.)

Jeśli dobrze Cię zrozumiałem, to coś w ten deseń:

unsigned char c;
unsigned int acc = 0;
int n = 0;

while((c = getc(f)) != EOF) {
    if((c & 0x80) == 0) { acc = c; n = 1; }
    else if((c & 0xC0) == 0x80) acc = (acc << 6) | c - 0x80;
    else if((c & 0xE0) == 0xC0) { acc = c - 0xC0; n = 2; }
    else if((c & 0xF0) == 0xE0) { acc = c - 0xE0; n = 3; }
    else if((c & 0xF8) == 0xF0) { acc = c - 0xF0; n = 4; }
    else if((c & 0xFC) == 0xF8) { acc = c - 0xF8; n = 5; }
         if((c & 0xFE) == 0xFC) { acc = c - 0xFC; n = 6; }
    
    if(--n == 0) {
        printf("U+%04X\n", acc);
    }
}
0 głosów
odpowiedź 22 czerwca 2021 przez Wiciorny Ekspert (272,250 p.)
1
komentarz 23 czerwca 2021 przez rottingham Nowicjusz (140 p.)

Separatory? Wiem, że w UTF-8 bajty są zakodowane w ten sposób, że pierwszy bajt określa, czy dany znak jest zakodowany na jednym bajcie, czy na więcej. A jeżeli na więcej, to wiem, że każdy następujący bajt musi zaczynać się od 10XXXXXX. I to jest świetny schemat do tego, żeby zdekodować znaki unicode. 

Tylko pytanie jest jak mogę z pliku tekstowego, gdzie są znaki alfanumeryczne wypisać znaki unicode? 

Weźmy na konkretnym przykładzie

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main() {

    unsigned int a = 'Ź';
    printf ( "%X", a );


}

Co program wyświetla? Kody hex na obu bitach w kodowaniu UTF-8. Czyli mamy C5 i B9, co daje nam 1100010110111001. Jak uzyskać kod Unicode? Proste, trzeba wyrzucić to co mówi nam ile jest bajtów i oznaczenia bajtu następującego. Wtedy zostaje nam: 00101111001 co w hex równa się 179. Mamy więc zdekodowany znak unicode, bo podstawiamy do wzoru: U+0179. Ja to wszystko wiem i rozumiem. Ale chodzi mi o to jak te wartości obliczyć w programie. To co wyświetla printf to jest tylko napis, nie jestem w stanie na nim pracować. Jak więc dokonać konwersji tego znaku do liczby, na której będę mógł wykonywać jakiekolwiek operacje? Jak te liczby zapisać w postaci binarnej, albo dziesiętnej, albo szesnastkowej, ale na której będą możliwe jakiekolwiek operacje? 

komentarz 26 czerwca 2021 przez overcq Pasjonat (21,820 p.)

Tutaj jest funkcja dekodująca: https://github.com/overcq/oux/blob/master/module/base/text.cx#L1014.

Co prawda może być na początku trudna do zrozumienia, ale jest poprawna.

Podobne pytania

0 głosów
0 odpowiedzi 455 wizyt
0 głosów
1 odpowiedź 1,558 wizyt
0 głosów
1 odpowiedź 384 wizyt
pytanie zadane 8 kwietnia 2022 w JavaScript przez Riddick Bywalec (2,600 p.)

92,681 zapytań

141,583 odpowiedzi

320,070 komentarzy

62,041 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...