• 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
552 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 (270,170 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,710 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 430 wizyt
0 głosów
1 odpowiedź 1,524 wizyt
0 głosów
1 odpowiedź 378 wizyt
pytanie zadane 8 kwietnia 2022 w JavaScript przez Riddick Bywalec (2,600 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...