c++, cout und UTF-8

Hoffentlich eine einfache Frage: cout scheint zu sterben, wenn der Umgang mit Zeichenfolgen, die am Ende mit einem multibyte-UTF-8 char, mache ich etwas falsch? Dies ist mit GCC (Mingw) auf Win7 x64.

**Edit-Sorry, wenn ich war nicht klar genug, ich bin nicht besorgt über die fehlende Glyphen oder wie die bytes interpretiert werden, sondern lediglich, dass Sie nicht zeigen, an alle die direkt nach dem aufrufen cout << s4 (fehlende BAR). Weitere couts nach der ersten Anzeige überhaupt keinen text!

#include <cstdio>
#include <iostream>
#include <string>

int main() {
    std::string s1("abc");
    std::string s2("…");  //… = 0xE2 80 A6
    std::string s3("…abc");
    std::string s4("abc…");

    //In C
    fwrite(s1.c_str(), s1.size(), 1, stdout);
    printf(" FOO ");
    fwrite(s2.c_str(), s2.size(), 1, stdout);
    printf(" BAR ");
    fwrite(s3.c_str(), s3.size(), 1, stdout);
    printf(" FOO ");
    fwrite(s4.c_str(), s4.size(), 1, stdout);
    printf(" BAR\n\n"); 

    //C++
    std::cout << s1 << " FOO " << s2 << " BAR " << s3 << " FOO " << s4 << " BAR ";
}

//results:

//abc FOO ��� BAR ���abc FOO abc… BAR

//abc FOO ��� BAR ���abc FOO abc…
  • Wo sind Sie mit Ihrem Programm? Die Windows-Eingabeaufforderung wirklich nicht, wie Unicode-viel, also, während Sie Ihr Programm schreiben, einfach gut, die Konsole nicht weiß, was mit ihm zu tun.
  • Die Windows-Konsole-subsystem nicht haben echte Probleme. WriteConsoleW funktioniert auch Recht gut, bei korrekten Schriftarten. Windows mag es nicht, UTF-8, obwohl, was bedeutet, dass WriteConsoleA wird ersticken hier.
  • Funktioniert bei mir unter Ubuntu/gnome-terminal/GCC. Ich vermute immer dieses Recht erfordert, dass sowohl C++ Richtigkeit und Einnahme von Plattform-Spezifika zu berücksichtigen.
  • Oh stimmt, ich sollte haben mehr spezifischen.
  • Leiten Sie die Ausgabe in eine Datei und öffnen Sie diese Datei in notepad. Was passiert?
  • Aufruf SetConsoleCP(65001) ist erforderlich, um die Schalter der Konsole auf utf8. Das finden einer schriftart mit fester Zeichenbreite, die fähig ist, der die Anzeige von Unicode-Symbole wird das schwierige problem.
  • Passant: Lucinda Console Truetype sollte den trick tun. Siehe support.microsoft.com/kb/99795
  • es nicht, es hat nur sehr wenige Glyphen. Check it out mit charmap.exe
  • Das nächste problem, das Sie kämpfen, ist, dass der CRT-code nicht handhaben ein Unicode-Codepage korrekt. Behoben in der nächsten version von VS, fallback auf WriteConsole(). Wenn Sie den Eindruck bekommen, Sie versuchen, etwas zu tun, die nicht gut unterstützt, dann hast du Recht.
  • Nicht in der Lage zu handhaben UTF-8 ist nicht ein echtes Problem??? Es ist ein Todesstoß.

InformationsquelleAutor user657267 | 2011-08-05
Schreibe einen Kommentar