[c++] porownywanie polskich znakow

Potrzebujesz pomocy z C, C++, perl, python, itp.
Chodak
Posty: 12
Rejestracja: 28 października 2007, 11:17

[c++] porownywanie polskich znakow

Post autor: Chodak »

Witam. Sprawa wydaje sie banalna ale probuje juz od dluzszego czasu i nic nie wymyslilem, problem jest nastepujacy: polskie znaki w tablicy sa przechowywane jako dwie wartosci a nie jedna (pewnie przez mala pojemnosc char), a co za tym idzie nie mozna ich normalnie porownac. Na przyklad - aby zamienic 'ą' na 'a' napisalbym:

Kod: Zaznacz cały

std::string str="ącą";
 
 if(str[0] == 'ą')
 str[0] = 'a';
 
 std::cout << str <<std::endl;
Taki zapis nic nie daje, rzutowania tez nie pomagaja... ma ktos pomysl?

Pozdrawiam
Chodak
salmon
Beginner
Posty: 296
Rejestracja: 12 października 2007, 23:28
Lokalizacja: Gliwice/Bielsko-Biała

Post autor: salmon »

Nie wiem czy to pomoże, ale poczytaj o typach wchar_t i wstring i o bibliotece locale z biblioteki standardowej c++.
hot_stuff
Posty: 27
Rejestracja: 30 sierpnia 2007, 20:04
Lokalizacja: NULL

Post autor: hot_stuff »

Skoro polskie litery sa przechowywane w tablicy jako dwa znaki to musisz hmmm...:
1. Dowiedziec sie jak te polskie litery sa rozbijane -> dzieki temu zapewne bedziesz w stanie zidentyfikowac w ktorym miejscu w tablicy wystepuje polska litera i wtedy juz powinienes w miare latwo moc porownac te dwie komorki tablicy z polska litera<troche zabawy mimo wszystko bedzie a sposobow realizacji tego tez jest dosyc sporo>
LUB:
2. Bedziesz musial wyszykiwac w stringu po kolei podciagow bedacych polskimi znakami - chodzi tu o to aby wyszukiwac w stringu kolejnych polskich znakow<cos na wzor wyszukiwania w tekscie "ala ma kota" slowa "kota"> Mozliwe, ze takie operacje sa zaimplementowane w STL'u. Mozliwe, ze przydatna okaze sie metoda find() z biblioteki string ;-)

Pozdrawiam.
mikolajs
Posty: 33
Rejestracja: 04 lutego 2008, 10:06
Lokalizacja: Gdañsk

Post autor: mikolajs »

Znaki w większości systemów linuxowych są kodowane w utf8. I kompilator c++ sobie z tym radzi.
Poszukiwany przez Ciebie znak jest zakodowany na dwóch bajtach pierwszy to prawdopodobnie 11000000. Spróbuj sobie wydrukować zapis zamieniony na kolejne byte, np coś takiego

Kod: Zaznacz cały

 
#include <string>
#include <iostream>

int main(){
   std::string napis("ą");
   int n = (int)napis.length();
   for (int i = 0; i < n; i++) std::cout  << (int)napis[i] << "\t";
   std::cout << std::endl ;
   char a;
   std::cin >> a;
 return 0;   
}
Jak będziesz znać bajty na których są zakodowane litery polskie to możesz robić podwójny warunek sprawdzając po kolei dwa bajty
Chodak
Posty: 12
Rejestracja: 28 października 2007, 11:17

Post autor: Chodak »

Rozwazalem sposob ktory zaproponowal hot_stuff jednak wydawal mi sie zbyt 'chaupniczy', rozwiazaniem ktorego szukalem okazal sie typ wstring kodujacy w utf16, dziala np nastepujacy zapis:

Kod: Zaznacz cały

#include <iostream>

 int main()
 {
 std::wstring str=L"ąc";
 if(str[0] == L'ą')
 str[0] = L'a';
 
std::wcout << str <<std::endl;
 }
dzieki salmon.

Pozdrawiam
Chodak
ODPOWIEDZ