Umlaute unter Windows zu Grossbuchstaben umwandeln?



  • Hi!

    ich habe versucht, mit towctrans in einem deutschen Text auch Umlaute wie ä und ö unter Windows in upper case umzuwandeln. Das Programm klappt unter Linux mit der setlocale(LC_CTYPE,"de_DE.UTF-8").
    Wenn ich aber unter Windows setlocale(LC_CTYPE,"German_Germany.1252") angebe, bleiben die Buchstaben ä und ö stehen, es unterstützt irgendwie Unicode nicht. de_DE.UTF-8 kennt Windows als locale überhaupt nicht. Auch der normale Befehl toupper() funktioniert nicht. Gibt es eine Möglichkeit, deutsche Umlaute unter Windows mit einem ANSI C-Programm groß- bzw. kleinzuschreiben?

    Vielen Dank & Gruß
    jesse



  • Die Datei in ein char-array einlesen, nach dem entsprechenden Code suchen, ersetzen. 🙂



  • Das ist natürlich die sicherste Methode. Aber gibt es nicht eine locale in Windows für UTF-8? 65001 funktioniert auch nicht. Default ist German_Germany.1252. Unter Linux funktioniert UTF-8.



  • Wozu benutzt Du towctrans?

    _strupr /_strlwr
    

    mit

    setlocale(LC_CTYPE,"German_Germany.1252");
    

    wandelt Dir die Umlaute ohne Probleme.

    Gibt es einen Grund warum Du nicht

    setlocale(LC_All,"German");
    

    nutzt?



  • Thuruks Methode ist nicht sicher.
    Die Ersetzung hängt von der verwendeten Codepage ab und das kann schief gehen.



  • Zu UTF-8 meint die MSDN

    The set of available languages, country/region codes, and code pages includes all those supported by the Win32 NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page like UTF-7 or UTF-8, setlocale will fail, returning NULL. The set of language and country/region codes supported by setlocale is listed in Language and Country/Region Strings.

    Der Link dazu:
    http://msdn.microsoft.com/de-de/library/x99tb11d.aspx

    Ruft man setlocale mit

    setlocale(LA_ALL,"")
    

    auf, wird die Codepage des Betriebssystems genutzt das sollte bei Windows UTF-8 sein.



  • Schau dir vielleicht mal libunistring an. Das ist eine vollständige Unicode-Implementierung. Damit kannst du das richtige Casemapping auch ohne locales machen. (Siehe u8_toupper)


Anmelden zum Antworten