Strona 1 z 1

[c++] porownywanie polskich znakow

: 03 lutego 2008, 21:34
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

: 03 lutego 2008, 22:54
autor: salmon
Nie wiem czy to pomoże, ale poczytaj o typach wchar_t i wstring i o bibliotece locale z biblioteki standardowej c++.

: 04 lutego 2008, 02:24
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.

: 04 lutego 2008, 10:37
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

: 04 lutego 2008, 12:03
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