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