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

Jak "wygląda"/ Jak sprawdzić/ Jak porównać zawartość zmiennej typu wchar_t ?

Object Storage Arubacloud
0 głosów
332 wizyt
pytanie zadane 21 października 2015 w C i C++ przez baszmest Gaduła (3,080 p.)

Język C - sytem Linux
Chcę sprawdzić czy znak z pliku lub z stdin jest polskim znakiem. Korzystam z tej tabeli : http://www.utf8-chartable.de/unicode-utf8-table.pl jednak tutaj polskie znaki mają tak jakby "podwójny kod". Wczytanie polskiego znaku do zwykłego chara powoduje że przypisuje mu tylko tę drugą część np. dla Ą - 85 . Chciałem zatem użyć wchar_t i tu nasuwa się pytanie: 
Jak wtedy wygląda zmienna typu wchar_t, gdybym chciał jej uzyć np. w if'ie.

wchar_t c;

while((c = fgetwc(stream) != WEOF)
if ( c == 0xc484) // w taki sposób ? W inny ?
{
....
}

PS. to pilne :)

1 odpowiedź

+2 głosów
odpowiedź 21 października 2015 przez furas Maniak (53,800 p.)
wybrane 21 października 2015 przez baszmest
 
Najlepsza

Znaki w UNICODE zajmują 4 bajty ale nie każdy znak wykorzystuje całą tą przestrzeń (dało by się go zapisać w 3, 2 lub jednym bajcie) więc stosuje się (że tak powiem) "kompresję" czyli kodowanie UTF-8, UTF-16. Dzięki temu jedne znaki zajmują jeden bajt, inne dwa bajty, a jeszcze inne nawet 6 bajtów. Ale aby rozpoznać czy znak zajmuje 3, 2 lub jeden bajt trzeba było mu dodać w pierszym bajcie na początku kilka bitów rozpoznawczych - te kilka bitów powoduje, że kod UTF-8 jest inny niż kod UNICODE. 

Problem będziesz miał gdy w pliku będzie znak składający się z jedego bajta (np. znak B kod 0x42 ) a dopiero potem znak składajacy się z dwóch bajtów (np. Ą - kod 0xC484) a za nim znów B. Wczytująć `wchar_t` pobierzesz znak składajacy sie z jednego bajtu oraz pierwszy bajt z drugiego znaku czyli w sumie 0x42C4. Drugie użycie `wchar_t` pobierze drugi bajt z litery Ą i bajt z drugiej litery B czyli w sumie 0x8442. Tak więc za każdym razem pobierzesz coś co nie ma wartości 0xC484 :)

Szukaj lepiej biblioteki do obsługi UTF-8 albo musisz bardziej rozbudować pobieranie znaków bo jeden znak może mieć długośc od jednego bajtu do 6 bajtów 

https://pl.wikipedia.org/wiki/UTF-8

komentarz 21 października 2015 przez baszmest Gaduła (3,080 p.)
Dzięki, będę wiedział czym się kierować :)

Podobne pytania

0 głosów
1 odpowiedź 208 wizyt
0 głosów
0 odpowiedzi 161 wizyt
pytanie zadane 22 grudnia 2019 w C i C++ przez Jacob7 Użytkownik (540 p.)
0 głosów
1 odpowiedź 221 wizyt
pytanie zadane 23 grudnia 2017 w C i C++ przez Kubaluk Nowicjusz (120 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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!

...