Unicode-Unterstützung in C++11



  • Hallo allerseits,

    Ich beiße mir gerade die Zähne mit der neuen Unicode-Unterstützung in C++11 aus. So 100%ig kapiere ich dass alles nicht. Mit UTF-8 ist alles ja kein allzugroßes Problem, aber wenn ich bspw. UTF-16 mit u16string oder UTF-32 mit u32string verwenden will, dann happert es. Hier mal ein Codeausschnitt womit ich meine Probleme habe und was ich meine:

    string str_u8{u8"Eurozeichen: \u20AC"};
      cout << str_u8 << endl;
    
      u16string str_u16{u"Eurozeichen: \u20AC"};
      //cout << str_u16 << endl;
    
      u32string str_u32{U"Eurozeichen: \u20AC"};
      //cout << str_u32 << endl;
    

    Wie kann man denn jetzt in C++11 bspw. jetzt einen u16string oder u32string ausgeben? Ist da vielleicht wie beim alten wchar_t mit wcout eine u16cout oder u32cout geplant und nur noch nicht implementiert?

    Oder muss ich etwa UTF-16 bzw. UTF-32 nach UTF-8 konvertieren? Soweit ich recherchiert habe, gibt es hierfür ja die Templates in codevct (welche aber hier bei mir gcc 4.7 noch nicht wollen).

    Viele Grüße
    Jonathan





  • cooky451 schrieb:

    http://www.c-plusplus.net/forum/310613

    Vielen Dank für den Link. So wie ich dass jetzt verstanden habe, muss ich also UTF-16 bzw. UTF-32 für eine simple Ausgabe in eine UTF-8 umwandeln?

    Ich habe dass mal mit folgendem Code versucht:

    #include <iostream>
    #include <locale>
    #include <codecvt>
    using namespace std;
    ...
    u16string str_u16{u"Eurozeichen: \u20AC"};
    wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> conv;
    string str16to8 = conv.to_bytes(str_u16);
    cout << str16to8 << endl;
    

    Leider spielt mein Compiler wieder bei codecvt nicht mehr mit und meldet:

    $ g++-mp-4.7 -o main main.cpp -Wall -pedantic -std=c++11
    main.cpp:4:19: fatal error: codecvt: No such file or directory
    compilation terminated
    

    Ich denke mir mal dass es halt nicht implementiert ist. Könnte mir jemanden meinen Code bestätigen, ob ich die Konvertierung richtig gemacht habe und ob mein Denkansatz überhaupt korrekt ist 😕



  • Header <locale>, nicht <codecvt>.

    < 💡 >



  • glühbirne schrieb:

    Header <locale>, nicht <codecvt>.

    < 💡 >

    < 😕 >



  • Du nimmst den falschen Header.

    < 💡 >



  • glühbirne schrieb:

    Du nimmst den falschen Header.

    < 💡 >

    Hmm, ohne <codecvt> geht es aber denke ich net. Dann gibt's:

    $ g++-mp-4.7 -o main main.cpp -Wall -pedantic -std=c++11
    main.cpp: In function 'int main()':
    main.cpp:13:3: error: 'wstring_convert' was not declared in this scope
    main.cpp:13:19: error: 'codecvt_utf8_utf16' was not declared in this scope
    main.cpp:13:38: error: expected primary-expression before 'char16_t'
    main.cpp:13:38: error: expected ';' before 'char16_t'
    main.cpp:14:21: error: 'conv' was not declared in this scope
    


  • Das liegt an deinem Compiler und nicht am Programmcode. wstring_convert ist nämlich in <locale> definiert.



  • q4adfba schrieb:

    Das liegt an deinem Compiler und nicht am Programmcode. wstring_convert ist nämlich in <locale> definiert.

    Vielen Dank 👍 jetzt hab ich es kapiert. Kennst du einen Compiler der dass kann?



  • schau halt nach http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport
    du musst bei deinem compiler den c++0x support auch möglicherweise noch aktivieren . beim gcc: -std=c++0x



  • vario-500 schrieb:

    schau halt nach http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport
    du musst bei deinem compiler den c++0x support auch möglicherweise noch aktivieren . beim gcc: -std=c++0x

    Die Seite kenn ich schon. Trotzdem danke! Soweit scheint es mit dem Konvertieren keiner zu können. clang++ (3.1), g++ (4.7) und Visual Studio 2012 können alle nichts damit anfangen 😞 ... ist wohl noch ein weitere Weg bis C+11 sinnvoll verwendet werden kann denke ich. 🙄 echt Schade, weil es gerade mit dem Unicode toll gewesen wäre.



  • Nimm eben bis dahin eine Bibliothek. SFML hat auch eine gewisse Unicode-Unterstützung.

    < 💡 >


Anmelden zum Antworten