Multichars (z.B. Umlaute) handlen



  • Morgen,

    ich habe ein Problem mit Multichars, von dem ich eigentlich gedacht hätte, es gäbe bereits Threads dazu, jedoch finde ich keine, entschuldigt bitte.

    Ich würde gern mit Sonderzeichen arbeiten und chars iterieren und einzeln bearbeiten bzw. die Länge eines Strings ermitteln.
    Das Problem, das sich hierbei ergibt ist das, dass Umlaute durch eine Kombination mehrerer Zeichen dargestellt werden und dadurch nicht auf die übliche Weise bearbeiten lassen.

    Dieser Code

    #include <string>
    #include <iostream>
    
    int main()
    {
        std::string test = "ä";
        std::cout << test.size() << std::endl << std::endl;
        for (auto i:test)
            std::cout << i << std::endl;
        std::cout << 'ä' << std::endl;
    
        return 0;
    }
    

    erzeugt folgende Ausgabe:

    2


    50084

    Und logischerweise beim Kompilieren (mit G++) folgende Warnung:

    test.cpp:10:18: Warnung: Zeichenkonstante mit mehreren Zeichen [-Wmultichar]

    Nun ist meine Frage:
    Wie geht man üblicherweise mit diesem Problem um?

    mit freundlichen Grüßen,
    Mr. Multichar



  • Ich vergaß zu erwähnen, dass std::wstring nicht infrage kommt.





  • [Rew.] schrieb:

    Bitte hier schauen: http://www.c-plusplus.net/forum/39326-full

    Funktioniert bei mir nicht, so werden Nichtdefinierte Zeichen ausgegeben.

    Das einzige, das ich noch gefunden habe, ist der Typ std::wstring_convert, der mit C++11 hätte hinzukommen sollen, jedoch wurde er bis jetzt nicht in GCC implementiert.

    Weiß zufällig jemand, wann der Typ voraussichtlich seinen Weg zu GCC findet und ob es vielleicht noch andere Möglichkeiten gibt?



  • Welche von den zwei Methoden funktioniert nicht? Beide??



  • [Rewind] schrieb:

    Welche von den zwei Methoden funktioniert nicht? Beide??

    Beide funktionieren nicht. Was damit zu tun haben könnte, dass ich mit Win32 nichts zu tun habe.



  • mbstowcs



  • MFK schrieb:

    mbstowcs

    Danke, auf die Idee, in der C-Lib nachzusehen, wäre ich gar nicht gekommen.

    Nun werfen die Befehle std::mbstowcs und std::wcstombs für mich die Frage auf: Woher kenne ich die Länge des resultierenden Strings?

    http://en.cppreference.com führt Folgendes Beispiel an:

    #include <iostream>
    #include <clocale>
    #include <cstdlib>
    
    int main()
    {
        std::setlocale(LC_ALL, "en_US.utf8");
        // UTF-8 narrow multibyte encoding
        const wchar_t* wstr = L"z\u00df\u6c34\U0001d10b"; // or L"zß水𝄋"
        char mbstr[11];
        std::wcstombs(mbstr, wstr, 11);
        std::cout << "multibyte string: " << mbstr << '\n';
    }
    

    http://en.cppreference.com/w/cpp/string/multibyte/wcstombs

    Weshalb die 11? Lässt sich die Länge irgendwie dynamisch bestimmen? std::basic_string::size() hilft mir hier scheinbar nicht weiter.



  • Mr. Multichar schrieb:

    Weshalb die 11? Lässt sich die Länge irgendwie dynamisch bestimmen?

    Auf der von dir verlinkten Seite steht:

    POSIX specifies a common extension: if dst is a null pointer, this function returns the number of bytes that would be written to dst, if converted. Similar behavior is standard for std::wcsrtombs.



  • MFK schrieb:

    Mr. Multichar schrieb:

    Weshalb die 11? Lässt sich die Länge irgendwie dynamisch bestimmen?

    Auf der von dir verlinkten Seite steht:

    POSIX specifies a common extension: if dst is a null pointer, this function returns the number of bytes that would be written to dst, if converted. Similar behavior is standard for std::wcsrtombs.

    Peinlich 😃 Danke, damit ist mein Problem wohl gelöst



  • Eine sehr nette kleine Library für grundlegendes Unicode- und UTF-8-Handling ist übrigens die libutf aus den Plan9ports. Hat ihren Ursprung im Plan-9-Betriebssystem, das als erstes OS überhaupt durchweg auf UTF-8 setze.

    http://swtch.com/plan9port/unix/


Anmelden zum Antworten