• 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 ?

Cloud VPS
0 głosów
394 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ź 273 wizyt
0 głosów
0 odpowiedzi 301 wizyt
pytanie zadane 22 grudnia 2019 w C i C++ przez Jacob7 Użytkownik (540 p.)
0 głosów
1 odpowiedź 268 wizyt
pytanie zadane 23 grudnia 2017 w C i C++ przez Kubaluk Nowicjusz (120 p.)

93,469 zapytań

142,404 odpowiedzi

322,716 komentarzy

62,852 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

Kursy INF.02 i INF.03
...