Unicode Frage?



  • Hallo Leute ich habe ein kleines Verständnis Problem im Punkte C++ unter dem g++ 4.3.3

    Und zwar folgendes

    const char * a = "äüöß";
     printf("%s",a);
    

    Die Ausgabe lautet äüöß
    Ich verstehe nur nicht warum das klappt.
    Eigentlich sollte unicode unterstützung doch unter wchar_t laufen und nicht schon unter char. Habe ich da etwas nicht mitbekommen. Oder habe ich grade einen Denkfehler und das hat schon immer geklappt

    Vielen dank schon mal für eure Antworten





  • Hallo rüdiger!
    So char ist 1 Byte lang
    für UTF8 benötige ich mehr BYTES (bis zu 4 BYTES). Soweit so gut. Geht der Compiler mittlerweile hin unterstützt in einem Char Array jetzt auch UTF8 Zeichen. D.h das er für ein ä z.B 3 BYTES allokiert? Und braucht man dann noch wchar_t und ist dies mittlerweile Standartverhalten bei den Compilern oder nur G++ spezifisch



  • Also normal ist das tatsächlich nicht. Wahrscheinlich ist das aber eine C und keine C++ Fähigkeit? Ich kenne mich mit C nicht aus. Vielleicht muß man explizit dem Compiler die C-Fähigkeit verbieten, wenn man C++ haben will? Oder es ist einfach ein Bug? (auch die GCC-Entwickler werden sicherlich Fehler machen) Es könnte aber auch einfach nur eine GCC-spezische Erweiterung sein, so wie es auch MS gerne hin und wieder in ihre Compiler verbaut. Oder es ist einfach kein UTF-8, sondern einfach nur zufällig die richtige Codepage? Weil da brauchst du auch nur 8 bit, um Sonderzeichen korrekt darzustellen.



  • Normal wirklich nicht. Kann jemand das mal unter Visual Studio unter Windows testen ich besitze kein Windows.



  • Cefour schrieb:

    Normal wirklich nicht. Kann jemand das mal unter Visual Studio unter Windows testen ich besitze kein Windows.

    Ich kann dir sagen, das const char* unter MSC definitiv kein UTF-8 ist! Aber die Zeichen werden richtig dargestellt, wenn man die korrekte Locale in der C++-Runtime und Codepage in der Konsole eingestellt hat. Ganz einfach. 🙂 Es gab mal dazu hier einen ellen langen Thread, wo das geklärt wurde.



  • Auf welches Dateiformat ist denn dein Texteditor (in dem du den C++-Sourcecode eingibst) eingestellt? Wenn der auf UTF-8 eingestellt ist, kann es sein, das die Linux-Konsole ebenfalls auf UTF-8 eingestellt ist.

    Gib mal die Länge deines Strings aus! Der ist wahrscheinlich in einem ASCII-Editor ziemlich kryptisch... halt UTF-8 kodiert. Und dann passt die Ausgabe auf der Konsole. Aber alles reiner Zufall, das dieser eine Fall funktioniert.

    Semantisch ist das ganze natürlich totaler Quatsch, in einem ASCII/ANSI-String UTF-8-zeichen zu speichern. Da würde ich eher einen const unsigned short* dafür nehmen... wenn es kein wchar_t sein sein.



  • Das wird es wohl sein. Die sache hat mich nur ein bisschen irritiert



  • Cefour schrieb:

    Normal wirklich nicht. Kann jemand das mal unter Visual Studio unter Windows testen ich besitze kein Windows.

    Ausgabe mit Visual Studio 2005 und MinGW 4.4.0: "õ³÷¯". Das liegt allerdings eher an der Shell, die eine etwas seltsame Codepage verwendet. Konvertiert man den String mit CharToOem() (des Win-API), wird der ursprüngliche String ausgegeben. sizeof("äüöß") ergibt 4.

    Insgesamt glaube ich, dass es an der eingestellten bzw. verwendeten Codepage liegt. Allerdings wohl eher nicht an der des erstellten Programms, sondern an der, die der Compiler verwendet?

    Vielleicht interessant in diesem Zusammenhang. Schreibt man dies:

    wchar_t *a = L"äüöß";
    std::wcout << a << std::endl;
    

    so schluckt Visual Studio den String ohne Murren (und verwendet ihn korrekt), während GCC folgende Fehlermeldung zeigt:

    converting to execution character set: Illegal byte sequence
    

    Stefan.



  • Artchi schrieb:

    Semantisch ist das ganze natürlich totaler Quatsch, in einem ASCII/ANSI-String UTF-8-zeichen zu speichern. Da würde ich eher einen const unsigned short* dafür nehmen... wenn es kein wchar_t sein sein.

    Sorry, aber das ist doch Unsinn. Natürlich sind UTF-8 Literale in C/C++-Code keine gute Idee, eben weil nicht sichergestellt ist, daß beispielsweise Editor und Konsole die selbe Codierung verwenden. Der Compiler selbst kümmert sich darum gar nicht erst.
    Aber char* ist prinzipiell schon genau der richtige Typ für UTF-8 Strings. Was sollte denn unsigned char* bringen (abgesehen davon, daß das so nicht geht)? Wofür steht denn die 8 in UTF-8? 😉



  • ich hoffe mal, euch ist bewusst, dass bereits in der normalen 8-Bit-ANSI Kodierung mit deutscher Codepage ä, ö, ü und ß enthalten sind...

    siehe hier
    so ähnlich findet man das auch in deutschen Tafelwerken 😉

    und da C/C++ nunmal nicht Standard-ASCII, sondern eben ANSI verwendet,
    gibt das auf deutschen Systemen keine Fehler 😉


Anmelden zum Antworten