Mam pytanie:
Czy do string'a można zapisać polskie znaki(ł ó ś ć ę ą ź ż itp)
U mnie albo polskich znaków nie wyświetla albo pokazuje krzaczki .
Zmieniłem już kodowanie w konsoli ale nie chce działać.
Poczytaj na temat kodowania.
Jaki system, jaki kompilator.
I co to znaczy "Zmieniłem już kodowanie w konsoli" - z jakiego na jakie?
-
w czym edytujesz program - edytor, IDE, notatnik?
-
pokaż fragment kodu o którym chcesz dyskutować
-
jak zmieniłeś kodowanie w konsoli
-
najlepiej załącz kod (jego najistotniejszy fragment oczywiście) w postaci załącznika, można będzie posprawdzać bez przekłamań
Więc tak:
- IDE to Code::Blocks
- Fragment kodu o którym chce dyskutować.
#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
string tekst = "ąśćę";
//cin >> tekst;
cout << tekst<<endl<<endl;
system("pause");
return 0;
}
- Kodowanie konsoli zmieniłem tym poleceniem
chcp 1250
- OS : Windows 7
- Kompilator g++
I jeszcze komentarz do kodu :
Gdy deklaruję string'a w ten sposób:
string tekst = "ąśćę";
wychodzą krzaczki
ale gdy w ten sposób:
string tekst ;
a tekst do string'a podaje w konsoli wszystko działa dobrze.(patrz komentarz)
A nie wystarczy po prostu taka sztuczka?
setlocale(LC_ALL, "Polish");
Sprawdź pod edytorem hexa (np. xvi32) czy znaczki w kodzie źródłowym odpowiadają stronie Windows 1250:
Rozwiązanie 100% skuteczne, ale nie zawsze łatwe w wykonaniu: zapisać plik źródłowy w kodowaniu CP852. Już bez dodatkowego kombinowania ani w kodzie źródłowym, ani żadnym chcp
.
Pytanie teraz tylko, czy Code::Blocks pozwoli ci zapisać plik jako 852.
Coś szukam na ten temat ale ie wiem czy to pomoże zapisac polski znak do zmiennej typu string :(
Ciagle próbuję coś z kodem ale zamiast polskich znaków wyświetla krzaczki albo puste pole.
Zamiast std::string użyj std::wstring
http://stackoverflow.com/questions/4246674/polish-chars-in-stdstring
EDIT: Podobno nie działa pod Linuxem.
kacper546 napisał(a):
Coś szukam na ten temat ale ie wiem czy to pomoże zapisac polski znak do zmiennej typu string :(
Ciagle próbuję coś z kodem ale zamiast polskich znaków wyświetla krzaczki albo puste pole.
Ten wątek widziałeś?
http://4programmers.net/Forum/C_i_C++/113148-C++_Polskie_znaki
czy taki program u ciebie prawidłowo działa?
#include <stdio.h>
#include <locale.h>
int main()
{
setlocale(LC_CTYPE, ".1250");
printf("zażółć gęślą jaźń\n");
}
(celowo w C żeby wyeliminować możliwe przyczyny problemu...)
EDIT: a taki?
#include <string>
#include <iostream>
#include <clocale>
int main()
{
std::setlocale(LC_CTYPE, ".1250");
std::string str = "zażółć gęślą jaźń";
std::cout << str << std::endl;
}
I program:
Niestety nie działa gdyż konsola zwraca śmieci
zaĹĽĂłĹ'Ä┼ gÄtĹ>lÄ jaĹşĹ"
II program:
To samo - również zwraca śmieci :
zaĹĽĂłĹ'Ä┼ gÄtĹ>lÄ jaĹşĹ"
A moje pytanie brzmi czemu nie działa taki oto kod:
#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int i = 0;
string tekst = "ż";
cin >> tekst;
if (tekst[i] == 'ż' )cout << "ż\n\n\n";
system("pause");
return 0;
}
Jeśli działał by prawidłowo to powinienem ujrzeć kolejne
ż
Nie działa, bo to co wprowadzasz ma inny kod niż to co masz w kodzie.
Przetestuj taki kod:
#include <iostream>
using namespace std;
void wyswietlLancuch(const string &str)
{
cout << str << dec << "( " << str.length() << " )" << endl;
for(string::const_iterator it = str.begin(), epos = str.end(); it != epos; ++it) {
cout << hex << (static_cast<int>(*it) & 0xff);
cout << ", ";
}
}
int main()
{
string tekst = "ĄĆŻŹąćżź";
cout << "Tekst z kodu: ";
wyswietlLancuch(tekst);
cout << endl;
cin >> tekst;
if (!tekst.empty())
{
cout << "Tekst wprowadzony: ";
wyswietlLancuch(tekst);
cout << endl;
}
}
I porównaj z tym:
http://en.wikipedia.org/wiki/Polish_code_pages
U mnie na Windows 7 wychodzi "IBM 852".
Czy powinno być coś takiego ??
@kacper546: najwyraźniej nie stosujesz się dokładnie do poleceń. w tym wątku jest zawarta wystarczająca informacja, by zaczęło ci działać.
To mi wychodzi coś takiego gdy pisze polskie znaki
ĄĘŚĆŁÓ
O to co wyszło:
A tu kod:
#include <iostream>
using namespace std;
void wyswietlLancuch(const string &str)
{
cout << str << dec << "( " << str.length() << " )" << endl;
for(string::const_iterator it = str.begin(), epos = str.end(); it != epos; ++it) {
cout << hex << (static_cast<int>(*it) & 0xff);
cout << ", ";
}
}
int main()
{
setlocale(LC_CTYPE,".1250");
string tekst = "ĄĘŚĆŁÓ";
cout << "Tekst z kodu: ";
wyswietlLancuch(tekst);
cout << endl;
cin >> tekst;
if (!tekst.empty())
{
cout << "Tekst wprowadzony: ";
wyswietlLancuch(tekst);
cout << endl;
}
}
Tekst wprowadzony sugeruje IBM 852 - tak jak u mnie. Celuj w tę stronę (kodową).
Tekst z kodu to jakiś miks - nie wiem dlaczego nie zgadza się z żadną stroną.
Może przez setlocale.
@kacper546: nie mam Code::Blocks, ale znajdź tam gdzieś opcję pozwalającą na ustawienie kodowania pliku .cpp
.
Gdzieś w opcjach zapisu, albo we właściwościach dokumentu...
Bez tego nie ruszysz.
Jest postęp teraz wyświetla polskie znaki jeśli są wprowadzone do string'a podczas kompilacji ale te same znaki wpisane podczas działania programu dają krzaczki.
Może to niezbyt odkrywcze ale okazuje się że tekst wprowadzony podczas kompilacji kodowany jest w Windows-1250 a tekst wprowadzany podczas działania programu to IBM 852
Napisz jak Ci się wreszcie uda znaleźć rozwiązanie - co zrobiłeś.
Wystarczy dać dwie rzeczy:
- SetConsoleOutputCP - http://msdn.microsoft.com/pl-pl/library/windows/desktop/ms686036%28v=vs.85%29.aspx
- SetConsoleCP - http://msdn.microsoft.com/pl-pl/library/windows/desktop/ms686013%28v=vs.85%29.aspx
i wszystko gra ... locale można nie ustawiać.