2015-05-12 7 views
5

Das Problem ist, dass ich versuche, einige Zeichen außerhalb des ASCII wie die deutschen Umlaute Zeichen, die 'ß' und dergleichen zu drucken. Diese Zeichen passen nicht in die normale char-Variable, also habe ich offensichtlich versucht, sie in ein wchar_t zu setzen und initialisierte die Zeichenfolge mit einem L ".....". Aber jedes Mal, wenn diese Zeichenfolge ein Zeichen von oben enthält, bekomme ich den erwähnten Fehler, aber es ist in Ordnung mit allen anderen Zeichen des ASCII. Das passiert auch mit u "....", U "......" und wenn ich den u8 "....." benutze, erzeugt es keinen Fehler, sondern druckt Müll.C++ - Fehler: Konvertierung in Ausführung Zeichensatz

So auf die Fragen:

  1. Wie kann ich dieses Zeichen drucken und andere Zeichen von außerhalb des ASCII-Zeichensatz?
  2. Was ist dieser Fehler überhaupt, was bedeutet es?
  3. Der einzige Weg, wie ich die Zeichen mit drucken konnte, war durch einen Aufruf von setlocale(), um das Gebietsschema auf die Umgebung Standard (Deutsch) einzustellen und dann einfach ein normales Array mit diesen Zeichen erzeugen wird keinen Fehler erzeugen und drucken richtig, das Problem hier ist WARUM !!? Ich verstehe nicht, warum das jetzt funktioniert, da die Größe des Char-Typs nicht geändert wird, also nehme ich nicht an, dass dieser Aufruf von setlocale() die Zuordnung von Zeichen im Standardzeichensatz ändert (ASCII normal) .
  4. Wenn jemand etwas mehr Erklärung zu den Thema Zeichensätzen geben kann und wie man mit ihnen in C++ und C umgehen kann, dann würde ich es sehr schätzen besonders mit dem UTF-8, 16, 32 (Sie müssen nicht schreib es dir selbst einige andere gut organisierte und relativ einfach zu verstehende Webseiten, die das Thema gründlicher angehen, sind sehr willkommen).

Beispiel wie gewünscht:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    wstring x = L"öäüß" ; 

    wcout << x ; 

    return 0 ; 
} 

Dieser druckt den Fehler.

#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 ; 
} 

Dies funktioniert ordnungsgemäß. Aber auch nach dem Ändern der Ländereinstellung, wenn ich den ersten Code mache, wird der Fehler generiert.

Hinweis: Ich bemerkte in C++ (nicht C), dass auch ohne den Einschluss einer anderen Datei als iostream der gesamte Inhalt anderer Dateien wie string oder locale oder irgendetwas anderes aus der Standardbibliothek deklariert wurde und im std-Namespace. Ich ignorierte dies für eine Weile und fügte trotzdem die Dateien für die Dokumentation ein, aber warum passiert das? (Ich verwende tdm-gcc 64bit)

+2

Möglicherweise möchten Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen, um Ihr Problem zu veranschaulichen und Buildfehler oder tatsächliche und erwartete Ausgaben einzubeziehen. –

+0

ok, ich werde das tun. – Lockon2000

+0

Ich habe die Beispiele aufgenommen. – Lockon2000

Antwort

2

Ich habe dieses Problem auch beim Kompilieren von Multi-Plattform-Projekten konfrontiert, die ursprünglich in Visual Studio bearbeitet wurden. VS verwendet einen anderen Zeichensatz (CP1252, zumindest in meinem Fall), während GCC UTF-8 erwartet. Sie können das Zeichen -finput-charset g ++ verwenden, um die Codierung Ihres Quellcodes anzugeben.

Verwandte Themen