Wie benutze ich getloc() richtig?



  • Habe vor kurzem angefangen mir c++ beizubringen.

    Und da ist mir aufgefallen, dass umlaute in der konsolenapp nicht richtig dargestellt werden.

    Also wollte ich nachgucken welches zeichenformat meine Konsole hat. Ich weiß, dass es in der cmd mit dem Befehl chcp geht.

    Aber ich möchte gerne, dass mein c++ Programm das ausgibt und bin auf getloc() gestoßen.

    Leider kann ich es nicht nutzen. Kann mir bitte jemand dabei helfen? Am besten mit einem kompletten Beispielcode?

    Habe nur ein Beispiel mit asiatischen Schriftzeichen gefunden, was glaube ich mehr macht...

    Besten Dank im Voraus
    Sebastian

    #include <iostream>

    Int Main
    {
    std::cout.getloc();
    Return 0;
    }

    Es ist nicht viel was ich als code habe.

    Aber ich möchte es einfach wissen wie getloc eingesetzt wird. Was man erhält. Und wie man die online Referenz richtig nutzt.

    Vielen Dank im Voraus.



  • Zeig doch mal den Code, den du schon hast. Vielleicht kann man dir anhand dessen ja helfen.

    Darüberhinaus ist es vergebene Liebesmüh, sich im Konsolenumfeld mit Locales oder Zeichenkodierungen zu beschäftigen. Wenn heutzutage was dargestellt wird, geschieht das doch eher über ein Frontend und in den Frontend-Frameworks wird der ganze Codierungsrotz und der Locale-Kram bereits nebenbei für dich übernommen.



  • Du suchst die statische Methode std::locale::global() womit du die Locale deines Systems auf dein Programm übertragen kannst. Erwartet wird ein std::locale Objekt was einen Locale-Namen als Parameter verlangt. Bleibt dieser leer wird die Default-Locale deines Systems verwendet:

    #include <locale>
         
    int main(){
        std::locale::global(std::locale{""});
        ...
    }


  • @eigenartig vielen Dank, das heißt der komplette Code wäre:

    #include <iostream>
    #include <locale>

    Int main()
    {
    Std::locale::global(std::locale{""});
    Std::cout.getloc();
    Return 0;
    }

    Ich benutze code::Blocks.
    Da kommt eine Warnung: extended initializer Lists only available with -std=c++11 or -std=gnu++11 [enabled by default]

    Was hat das zu bedeuten?

    Konnte das Programm auch ausführen. Leider zeigt es nichts an.

    Kannst du mir bitte noch mal helfen?

    Vielen Dank schon mal im Voraus.



  • Das bedeutet, dass du in den compileroptionen deines Projekts das Häkchen bei "c++11", "c++14" oder "c++17" setzen musst.



  • @It0101 danke die Option habe ich jetzt gefunden. Leider zeigt er trotzdem nicht das gewünschte an.

    Es kommt keine Warnung mehr.

    Was mache ich nicht richtig?



  • @Sebastian_L sagte in Wie benutze ich getloc() richtig?:

    std::cout.getloc();

    Du müßtest den Rückgabewert nutzen, z.B.

    std::cout << std::cout.getloc().name();
    

    Das wird dir jedoch auch nur einen leeren String ausgeben, da du ja vorher std::locale{""} gesetzt hast. 😉

    Für Windows gibt es die Funktionen GetConsoleCP sowie GetConsoleOutputCP, um die aktuelle Codepage auszulesen.



  • @Th69 danke für deine Antwort. Wenn ich es richtig verstehe, heißt es, dass getloc nur in Verbindung mit dem Standard setzen genutzt werden kann.

    Und die anderen beiden Funktionen nur für Windows gelten. Gibt es sowas auch für Linux oder Android?

    Besten Dank im Voraus.



  • Linux und Android verwenden standardmäßig UTF-8.

    Wenn du String-Literale (mit Umlauten) direkt in deinem Code verwendest, dann speichere die Source-Datei einfach als UTF-8 ab.



  • @Sebastian_L sagte in Wie benutze ich getloc() richtig?:

    @eigenartig vielen Dank, das heißt der komplette Code wäre:

    #include <iostream>
    #include <locale>

    Int main()
    {
    Std::locale::global(std::locale{""});
    Std::cout.getloc();
    Return 0;
    }

    Ich benutze code::Blocks.
    Da kommt eine Warnung: extended initializer Lists only available with -std=c++11 or -std=gnu++11 [enabled by default]

    Was hat das zu bedeuten?

    Konnte das Programm auch ausführen. Leider zeigt es nichts an.

    Kannst du mir bitte noch mal helfen?

    Vielen Dank schon mal im Voraus.

    std::locale::global() setzt nur die Default-Locale, sodass beim Erstellen einer Locale mit Default Konstruktor genau diese übergebene Locale benutzt wird.

    Das affektiert jedoch nicht std::cout und std::cerr, weil diese zum Zeitpunkt wo std::locale::global() aufgerufen wird bereits ein erstelltes Locale-Objekt besitzen. Was du also tun musst ist es, die Locale für std::cout noch zu setzen.

    #include <iostream>
    #include <locale>
    
    int main(){
        std::locale::global(std::locale{""});
        std::cout.imbue(std::locale{});
        std::cout << std::cout.getloc().name() << '\n';
    }
    

Log in to reply