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

Operacje na polskich znakach C++

Aruba Cloud - Virtual Private Server VPS
+1 głos
712 wizyt
pytanie zadane 7 lutego 2022 w C i C++ przez kubsde Nowicjusz (130 p.)

Witam, wiem że temat był poruszany mnóstwo razy, ale żaden z przejrzanych przeze mnie wątków nie rozwiązał mojego problemu. Piszę program wyszukujący słowa, które da się ułożyć z podanych liter. Taka wyszukiwarka do gry w scrabble.

Program porównuje znaki wejścia (lista słów) do podanych liter na zwykłym stringu, np.:

if(słowo[1] == tekst[5]) takieSame=true;

W przypadku gdy słowo[1] oraz tekst[5] to takie same znaki, które są literami diakrytycznymi, to program je ignoruje i warunek if-a nie będzie spełniony.

Klasyczne 

setlocale(LC_ALL, "pl_PL");

nie pomaga. Na forum znalazłem coś takiego, jest tam mowa (w ostatniej odpowiedzi) o zmianie modulo z 127 na 255, jednak nie do końca rozumiem co to znaczy, a być może jest to rozwiązanie potrzebne dla mnie. Jeśli tak, to proszę o wytłumaczenie, a jeśli nie to czy istnieje jakiś inny sposób aby to obejść?

komentarz 7 lutego 2022 przez Oscar Nałogowiec (29,340 p.)
To jest trudny temat. Język C to bardzo stare narzędzie. zasadniczo operuje on jedynie znakami o rozmiarze bajtu. Tam polskie znaki tak ogólnie się nie mieszczą. Dawno temu powstało kilka modyfikacji by tam upchać polskie znaki, ale są one różne. O ile ciągle takie znaki mieszczą się w bajcie to zasadniczo program nie zależy od konkretnej wersji (strony kodowej), musisz jedynie zapewnić by wszystkie dane (słówka, literki, terminal, program źródłowy) pracowały spójnie - tzn w tym samym kodowaniu. Uniwersalnym rozwiązaniem jest przeście na unicode, ale wtedy też nie jest prosto - trzeba używać wchar, wstring itp. Dane zewnętrzne też muszą być w unicode. Być może najnowsze wersje C++ coś tutaj rozwiązały. Stąd twoje problemy.

1 odpowiedź

0 głosów
odpowiedź 7 lutego 2022 przez overcq Pasjonat (22,440 p.)
setlocale(LC_ALL, "pl_PL");

może ustawiać polski język z kodowaniem UTF-8.

U mnie na Gentoo Linux jest plik /etc/locale.gen o następującej zawartości:

en_US ISO-8859-1
en_US.UTF-8 UTF-8
pl_PL ISO-8859-2
pl_PL.UTF-8 UTF-8

Dla "pl_PL" ustawia kodowanie ISO-8859-2, które jest bajtowe, więc podany przez Ciebie przykład porównania powinien dla niego działać. (U Ciebie może być oczywiście inna zawartośc pliku /etc/locale.gen.)

Na Windowsie mógłbyś ustawić tak, jak podane tutaj. Strona kodowa 1250 dla języka polskiego. No i jeśli masz w pliku źródłowym C zapisane znaki, to ten plik powinien być zapisany w tej stronie kodowej.

komentarz 8 lutego 2022 przez j23 Mędrzec (195,240 p.)
Kodowanie 1250 to kodowanie ANSI, ale jeśli słowa do porównania pobiera z konsoli, to tam będzie miał kodowanie OEM - czyli dla pl to cp852.

Podobne pytania

0 głosów
1 odpowiedź 4,706 wizyt
pytanie zadane 17 maja 2017 w C i C++ przez chacken Użytkownik (820 p.)
+1 głos
2 odpowiedzi 552 wizyt
0 głosów
1 odpowiedź 295 wizyt
pytanie zadane 2 lutego 2017 w C i C++ przez Piotr Lis Obywatel (1,310 p.)

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...