2015-05-12 12 views
5

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:

  1. Jak mogę wydrukować ten postacie i inne znaki spoza ASCII zestawu?
  2. Co to za błąd, co to znaczy?
  3. 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) .
  4. 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)

+2

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. –

+0

ok, zrobię to. – Lockon2000

+0

Zawarłem przykłady. – Lockon2000

Odpowiedz

2

Zaskakiwałem ten problem także podczas kompilowania projektów wieloplatformowych, które były początkowo edytowane w Visual Studio. VS używa innego zestawu znaków (CP1252, przynajmniej w moim przypadku), podczas gdy GCC oczekuje UTF-8. Możesz użyć flagi -finput-charset g ++, aby wskazać kodowanie kodu źródłowego.