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

Polskie znaki w wstring, dziwna sprawa...

Object Storage Arubacloud
+2 głosów
1,369 wizyt
pytanie zadane 27 grudnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
edycja 27 grudnia 2017 przez Jakub 0

Witam, ostatnio robię takie projekty że ciągle na przeszkodzie idzie mi kodowanie polskich znaków... Teraz doszedłem jednak do bardzo ciekawej sytuacji (nie mam bladego pojęcia o co tu chodzi). Najpierw pierwszy prosty przykład:

wstring str; //rozszerzony string 
getline(wcin, str); //wczytywanie linii (np wczytam łąka)
wcout << str << endl; //wyświetlanie odpowiednim obiektem jakim jest wcout (wyświetli mi się poprawnie łąka)

Program poprawnie wczytuje i wyświetla łańcuch (użyłem oczywiście typu rozszerzonego jakim jest std::wstring). Wszystko też działa gdy zamiast getline dam cin, analogicznie chyba podobnie w przypadku wczytania danych z pliku.

Ale teraz dochodzimy do czegoś to mnie przerasta:

wstring str = L"łąka"; //podobnie jak wcześnie ale tym razem od razu podałem tekst bez wczytywania 
wcout << str << endl; //no i nic nie ma :X 

Kiedy nie pobiorę tekstu z żadnego strumienia tylko go podam operatorem przypisania to polskie znaki mi się nie wyświetlają poprawnie albo nie wyświetla się nic. O co tu znowu chodzi?

I jeszcze jedno małe pytanko korzystając z okazji, słyszałem że polskie litery za zakodowanie na dwóch bajtach dlatego np do pliku można wstawić pierwszy i drugi człon takiego znaku, oto przykład:

ofstream plik("hello.txt");
//litera 'ą' to w hex 0xC485

int a = 0xC4; //pierwszy człon
int b = 0x85; //drugi człon 
plik << char(a) << char(b); //dlaczego jest taki efekt że wypisze ą a nie np Ä… bo to oznaczają pojedyncze części w kodowaniu UTF-8  z którego korzysta notatnik. 
	
plik.close();

Skąd taki wynik, skąd program wie kiedy dwa typy char stawione do strumienia zinterpretować jako jeden znak na dwóch bajtach a kiedy wyświetli je oddzielnie? Zauważyłem też że kiedy zrobię tak:

plik << char(a) << char(b);

to rezultat jest jeszcze inny ;(

Będę bardzo wdzięczny za pomoc i z góry bardzo dziękuje wink

1 odpowiedź

+1 głos
odpowiedź 27 grudnia 2017 przez JAKUBW Nałogowiec (33,470 p.)
edycja 27 grudnia 2017 przez JAKUBW
 
Najlepsza

Dodaj na początku main'a tą linijkę: 

std::locale::global(std::locale(""));

ewentualnie 

setlocale(LC_ALL, "");

 

komentarz 27 grudnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki, a wystarczyła jedna instrukcja... Ale czy był byś mi w stanie wytłumaczyć z czego wynikał mój problem z tym zachowaniem wstring'a? Bo jestem dość ciekawy :). Swoją drogą zedytowałem jeszcze pytanie i dodałem jedną kwestię, jak być mógł na nią zerknąć to będę bardzo wdzięczny.
1
komentarz 27 grudnia 2017 przez JAKUBW Nałogowiec (33,470 p.)
edycja 27 grudnia 2017 przez JAKUBW

Nie mam zielonego pojęcia, też miałem ten problem. Jednak gdy w zmiennej std::wstring jest "aącć" to w konsoli pojawi się tylko litera 'a'. To ciekawe :)

Natomiast co do dopisanej części pytania w pliku cały czas są te 2 bajty (można zobaczyć hexeditorem). Na uwagę zasługuje fragment wikipedii:

UTF-8 – system kodowania Unicode, wykorzystujący od 1 do 6 bajtów do zakodowania pojedynczego znaku.

 Także znaki w UTF-8 nie są kodowane tylko na 8 bitach (myląca nazwa). 

Zapisane dane szesnastkowo to C485 co binarnie daje 1100 0100 1000 0101 notatnik wykrywa że jedna literą ma 2 bajty (pierwsze 0 binarnie jest na 3 pozycji więc 2 bajty). Czytaj więcej. Wychodzi na to że notatnik jest inteligentny i się domyśla bo równie dobrze mógłby wyświetlić to w ANSI. Co ciekawe gdy wpisze się znak o wartości B9 to też wyjdzie literka ą tylko że w ANSI, zapisana tym razem na 1 bajcie.

W notepad++ jest opcja Format->Koduj w ANSI i wtedy wyświetla Ä…

Powiem szczerze że nie znam się na kodowaniach

komentarz 27 grudnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki za pomoc, widzę że temat kodowania jest dość obszerny... ale przynajmniej w większości frameworków i bibliotek do GUI nie trzeba się o polskie znaki martwić :) Pozdrawiam

Podobne pytania

0 głosów
1 odpowiedź 144 wizyt
0 głosów
1 odpowiedź 90 wizyt
pytanie zadane 7 grudnia 2020 w Systemy operacyjne, programy przez karpi2 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 95 wizyt
pytanie zadane 24 stycznia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,568 zapytań

141,420 odpowiedzi

319,617 komentarzy

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

...