2011-01-16 19 views
16

Ich versuche, neue Unicode-Zeichen in C++ 0x zu verwenden. Also schrieb ich Beispielcode:Unicode-Unterstützung in C++ 0x

#include <fstream> 
#include <string> 
int main() 
{ 
    std::u32string str = U"Hello World"; 

    std::basic_ofstream<char32_t> fout("output.txt"); 

    fout<<str; 
    return 0; 
} 

Aber nach Ausführung dieses Programms Ich bin immer leer output.txt Datei. Warum druckt es nicht Hallo Welt?

Auch gibt es so etwas wie ein cout und cin bereits für diese Typen definiert sind, oder stdin und stdout unterstützt Unicode nicht?

Edit: Ich benutze g ++ und Linux.

BEARBEITEN: ANTWORT. Ich habe entdeckt, dass das Standardkomitee Unicode-Streams von C++ 0x ablehnt. Die zuvor akzeptierte Antwort ist also nicht mehr korrekt. Für weitere Informationen siehe my answer!

+0

Ist die Datei leer, weil es 0 Byte hat, oder ist es leer, weil Texteditor alle druckbaren Zeichen nicht zeigt? – Gabe

+1

@Gabe es hase 0 Bytes – UmmaGumma

+0

Welche GCC-Version verwenden Sie? – ssmir

Antwort

6

Unicode-Zeichenfolgenliterale unterstützen began in GCC 4.5. Vielleicht ist das das Problem.

[Bearbeiten]

Nach einigem Graben ich gefunden habe, die für diese neue Unicode-Literale Ströme werden in N2035 beschrieben und es war included in einem Entwurf des Standards. Gemäß diesem Dokument benötigen Sie , um die Zeichenfolge auszugeben, aber diese Klasse fehlt in der Bibliothek GCC 4.5 C++ 0x.

Als Abhilfe können Sie gewöhnlichen fstream verwenden können:

std::ofstream fout2("output2.txt", std::ios::out | std::ios::binary); 
fout2.write((const char *)str.c_str(), str.size() * 4); 

So kann ich die Zeichenfolge in UTF-32LE auf meinem Intel-Rechner haben Ausgang (die Little-Endian ist).

[Bearbeiten]

war ich ein wenig falsch über den Status der u32ofstream: nach dem latest draft auf dem die C++ Standards Committee web site Sie haben std::basic_ofstream<char32_t> zu verwenden, wie Sie getan haben. Diese Klasse würde die Klasse codecvt<char32_t,char,typename traits::state_type> verwenden (siehe Ende von §27.9.1.1), die in der Standardbibliothek implementiert werden muss (Suche im Dokument codecvt<char32_t), aber in GCC 4.5 nicht verfügbar.

+0

Ich führe gcc 4.5.2 und bekomme das gleiche Ergebnis wie das OP :( –

+0

Laut Grigory Javadyan ist es kein Problem. :( – UmmaGumma

+0

Ich habe versucht mit meinem gcc 4.5 und redigierte meine Antwort – ssmir

1

Beim Erstellen versucht der Stream, ein 'codecvt' aus dem globalen Gebietsschema zu erhalten, aber es wird nicht erreicht, weil die einzigen Standard-Codecvts für char und wchar_t gelten. Als Ergebnis ist _M_codecvt Mitglied des Stream-Objekts NULL. Später, während des Ausgabeversuchs, löst Ihr Code eine Ausnahme (für den Benutzer nicht sichtbar) in der Facetchecking-Funktion in basic_ios.h aus, da die Facette von _M_codecvt initialisiert wird.

Fügen Sie dem lokalen Element, das dem Stream zugeordnet ist, eine Facette hinzu, um die Konvertierung von char32_t in die korrekte Ausgabe durchzuführen. Den Stream mit einem Gebietsschema versehen, das einen Codecvt vom richtigen Typ enthält.

+0

C++ Code aus meine antwort enthält ein beispiel, wie lesen/schreiben 'wchar_t' basiert ströme in' 'utf-8'' auf eine weise in ihrer antwort beschrieben http://stackoverflow.com/questions/2522152/python-is-a-dictionary-slow -zu-finden-Frequenz-of-jeden-Zeichen/2525617 # 2525617 – jfs

3

Im neuen C++ - Standard wird es keine Unicode-Streams geben.

Wie @ssmir erwähnt, sollte Standard-Komitee Stream-Unterstützung für Unicode in C++ 0x hinzufügen. In den Feature Editionen entschied sich das Komitee jedoch, die Stream-Unterstützung für Unicode zu entfernen.Weitere Informationen finden Sie unter link.

Es scheint, als wäre die einzige Möglichkeit, Unicode-Zeichenfolgen auszugeben, die Konvertierung in ASCII-Zeichenfolgen mit codecvt.

+0

Hä? Wo haben ssmir bedeuten, dass? Ihr Link ist mit einem 4-jährigen Papier. – Potatoswatter

+1

Die Norm enthält Unicode-Streams zumindest in th Der letzte Entwurf. Siehe meine bearbeitete Antwort. – ssmir

+0

genau welche Antwort? Wie? Ich muss etwas wie cout verwenden, aber ich habe einen u32string, den ich ausgeben muss. http://en.wikipedia.org/wiki/C%2B%2B11 zeigt mir, wie man Unicode-Strings macht, und ich schaute in die gcc-String-Header, um u32string zu finden. –