Problem polega na tym, że próbuję wydrukować niektóre znaki poza ASCII, takie jak niemieckie znaki umlaut, "ß" i tym podobne. Te znaki nie pasują do normalnej zmiennej char, więc oczywiście próbowałem umieścić je w wchar_t i zainicjowałem ciąg literą L ".....". Ale za każdym razem, gdy ten ciąg zawiera znak z góry, pojawia się wspomniany błąd, ale jest w porządku w przypadku wszystkich innych znaków ASCII. Tak samo dzieje się w przypadku "...", U "......", a jeśli użyję U8 ".....", nie wygeneruje błędu, ale wydrukuje śmieci.Błąd C++: Konwersja do zestawu znaków wykonania
więc do pytania:
- Jak mogę wydrukować ten postacie i inne znaki spoza ASCII zestawu?
- Co to za błąd, co to znaczy?
- Jedynym sposobem, w jaki mogłem wydrukować znaki, było wywołanie setlocale(), aby ustawić ustawienia regionalne na domyślne środowisko (niemiecki), a następnie po prostu tworząc normalną tablicę z tymi znakami, nie wygeneruje błędu i wydrukuje poprawnie, problem tutaj jest DLACZEGO !!? Całkowicie nie rozumiem, dlaczego to działa teraz, ponieważ rozmiar typu char nie zostaje zmieniony, więc nie zakładam, że to wywołanie setlocale() zmieni mapowanie znaków w domyślnym zestawie znaków (normalnie ASCII) .
- Jeśli ktokolwiek może podać trochę więcej wyjaśnień na temat zestawów znaków i jak sobie z nimi radzić w C++ i C, to byłbym bardzo wdzięczny, szczególnie z UTF-8, 16, 32 (nie musisz napisz sam sobie, że nawet inne dobrze zorganizowane i stosunkowo łatwe do zrozumienia strony internetowe, które zajmują się tym tematem w sposób bardziej dogłębny, są bardzo mile widziane).
przykład na żądanie:
#include <iostream>
#include <string>
using namespace std;
int main()
{
wstring x = L"öäüß" ;
wcout << x ;
return 0 ;
}
Drukuje błędu.
#include <iostream>
#include <string>
#include <locale>
using namespace std;
int main(void)
{
setlocale(LC_ALL,""); // sets locale to german on my computer
string x = "äöüß" ;
cout << x ;
return 0 ;
}
Działa to poprawnie. Ale nawet po zmianie ustawień regionalnych, jeśli wykonuję pierwszy kod, generowany jest błąd.
Uwaga: Zauważyłem w C++ (nie C), że nawet bez uwzględnienia jakiegokolwiek pliku innego niż iostream, zadeklarowano całą zawartość innych plików, takich jak ciąg znaków, ustawienia narodowe lub cokolwiek innego z biblioteki standardowej, oraz w przestrzeni nazw standardowej. Zignorowałem to przez chwilę i nadal dołączam pliki do dokumentacji, ale dlaczego tak się dzieje. (Używam tdm-gcc 64bit)
Użytkownik może chcieć utworzyć [Minimalny, kompletny i sprawdzalny przykład] (http://stackoverflow.com/help/mcve), aby zilustrować problem i dołączyć błędy kompilacji lub rzeczywiste i oczekiwane wyniki. –
ok, zrobię to. – Lockon2000
Zawarłem przykłady. – Lockon2000