Umlaute mit std::string in Windows



  • Hallo,

    habe ein Problem mit Umlauten unter Windows. Habe gelesen, dass Windows intern zur Unicode-Darstellung nicht wie andere Betriebssysteme UTF-8, sondern UTF-16 benutzt. Und das beeinflusst dann die C/C++-Standardbibliotheken negativ.

    Ich benutzte eine Bibliothek (poco) zum zippen von Files. Und wenn ich mir den Inhalt des Zip-Files anschaue, sind alle Datei oder Pfadnamen mit Sonderzeichen korrupt. Die Bibliothek ist leider aufgebaut mit C/C++-Standardbibliotheken wie std::string, std::ifstream, etc.

    Einzige Möglichkeit unter Windows um mit Umlauten korrekt arbeiten zu können ist dann mit std::wstring zu arbeiten?

    Danke



  • Entweder wstring oder wchar_t *.
    Hast du einen Link zu den erwähnten negativen Auswirkungen von UTF16 auf die Standardbibliothek?





  • http://www.quintilianus.eu/posts/2013/3/13/c,_plattformunabhängig,_unicode_und_windows schrieb:

    #include <iostream>
    #include <fstream>
    
    int main(int argc, char* argv[])
    {
    	std::ofstream file("Bärenstark.txt", std::ios::out | std::ios::trunc);
    	file << "Bärenstarker Inhalt" << std::endl;
    	file.close();
    	return 0;
    }
    

    [...]Auf Windows guckt man in die Röhre — ganz egal, ob man mit MinGW den g++ verwendet oder Microsofts Visual C++ Compiler (MSVC). Das Ergebnis ist unleserliches Zeug im Dateinamen

    Hm,...
    hab das grad unter MSVC 2013 und Windows 8.1 kompiliert und hatte keine Probleme mit unleserlichen Dateinamen, etc.

    floorball



  • Mir ist aufgefallen, wenn ich folgenden string ausgebe:

    std::string mytext("asdasÄÖÜüöä");
    qDebug() << "mytext" << mytext.c_str();
    

    gibt er mir es korrekt aus mit:

    mytext asdasÄÖÜüöä

    Ich bin nicht sicher, vielleicht wird der String in Windows noch konvertiert in wstring bei der Ausgabe?!

    Schau ich mir aber den Wert von mytext im debugger an, ist der Wert:

    "asdasÃ\204Ã\226Ã\234üöä"



  • verliernix schrieb:

    Schau ich mir aber den Wert von mytext im debugger an, ist der Wert:

    "asdasÃ\204Ã\226Ã\234üöä"

    Dann geht der Debugger wohl von einer anderen Zeichencodierung aus.

    std::string enthält keine Information über die verwendete Zeichencodierung, der speichert nur Bytes. Welche Bytes da gespeichert werden, hängt davon ab, wo der String herkommt. In deinem Fall kommt der String direkt aus dem Code, also hängt es davon ab, welche Codierung dein Quellcodeeditor benutzt. Wenn du den String irgendwo benutzt, wo eine andere Codierung erwartet wird, kommt dabei Unsinn heraus. Finde heraus, welche Codierung poco erwartet, und sorge dafür, dass deine Strings diese Codierung verwenden.



  • In der Poco Doku steht:

    The following encodings are currently supported:
    ASCII, Latin-1, Latin-9, Windows-1252, UTF-8 and UTF-16.
    The recommended encoding with POCO is UTF-8.
    ...
    POCO then calls the Unicode variants of the Windows API
    functions and converts strings between UTF-8 and UTF-16

    Poco bietet mir auch eine Konvertierungsmethode an:

    static std::string transcode(
        const std::string & path
    );
    
    On Windows, if POCO has been compiled with Windows UTF-8 support (POCO_WIN32_UTF8), this function converts a string (usually containing a path) encoded in UTF-8 into a string encoded in the current Windows code page.
    This function should be used for every string passed as a file name to a string stream or fopen().
    On all other platforms, or if POCO has not been compiled with Windows UTF-8 support, this function returns the string unchanged.
    

    Wenn ich diese Methode meinen String übergebe, wird der String im debugger wieder richtig dargestellt.

    Benutzte ich aber den konvertierten string weiter mit der poco Bibliothek
    ist mein Filename mit Umlaut immer noch korrupt.

    Vielleicht ein bug in der poco-lib


Anmelden zum Antworten