facet ändern



  • Man könnte die Ausgabe in der Konsole ja per >file.txt in eine Datei umleiten (und dann mit einem Hex-Editor anschauen).



  • @Meep-Meep:

    Gibt es einen unterschied der Darstellung bei folgenden code?

    #include <iostream>
    #include <locale>
    
    int main()
    {
        std::locale loc_ger("de");
    const auto &f = std::use_facet<std::ctype<char>>(loc_ger);
    std::locale loc = std::locale(loc_ger, &f);
    std::locale::global(loc);
    std::cout << "üöäÜÖÄ" << std::endl;
    std::cout << "locale: " << loc.name() << std::endl;
    std::cout << "utf-8 encoded: \303\274\303\266\303\244\303\234\303\226\303\204" << std::endl;
    }
    

    Die utf-8 encoded enthält üöäÜÖÄ utf-8 kodiert in oktaler schreibweise.

    Bei https://rextester.com/l/cpp_online_compiler_visual bekomme ich folgende ausgabe:

    üöäÜÖÄ
    locale: *
    utf-8 encoded: üöäÜÖÄ

    Also identisch



  • @firefly die ausgabe:

    ³÷õ▄Í─
    locale: *
    utf-8 encoded: ├╝├Â├ñ├£├û├ä
    

    wenn es an der codierung liegen wuerde, dann wuerde ich immer das problem haben. aber so lange ich standard locales erstelle passt alles. was rextester da im hintergrund am laufen hat, weiß ich nicht. vielleicht kann ja jemand hier, der VS2019 hat, den source auch mal testen und schreiben, was er fuer eine ausgabe bekommt.



  • Das sieht echt nach einem reinem Darstellungsproblem aus.
    Gut wäre es jetzt zu sehen ob das gleiche Ergebnis kommt, wenn die Ausgabe direkt in eine Datei umgeleitet wurde.

    Dann könnte man sich mit einem Hexeditor anschauen wie die einzelnen Zeichen kodiert sind.



  • @firefly hier die umleitung in eine datei. editor ist auf ansi gestellt

    üöäÜÖÄ
    locale: *
    utf-8 encoded: üöäÜÖÄ
    

    umlaute sind da, passt. es ist einfach das local was nicht stimmt. wenn ich die umlaute mittels std::locale("C") ausgebe bekomme ich auch wieder die selben zeichen:

    ³÷õ▄Í─
    

    das darstellungsproblem, wie du es nennst, kommt vom "C" locale.



  • Welche Codepage ist denn bei deiner Konsole eingestellt (weil es wundert mich jetzt, daß die Konsolenausgabe jetzt anders als die Dateiausgabe ist)?
    Mit chcp kannst du diese abfragen bzw. mit chcp nnn entsprechend setzen.
    Standardmäßig (bei einem deutschen System) ist 850 ("DOS-Latin-1") in der Konsole eingestellt, während unter Windows (also Desktop bzw. Explorer) 1252 (Westeuropäische Sprachen) als ANSI aktiviert ist.

    Setze diese in der Konsole auch mal auf 1252 und teste dann noch mal.
    Daß du jedoch bei "de" die richtige Ausgabe erhältst, bei der Änderung mit use_facet aber nicht, deutet m.E. aber trotzdem auf einen Fehler hin.

    Mit z.B. "Notepad++" kannst du für den Text in einer Datei auch die Codepage umschalten (so daß du die Codepage damit ermitteln kannst).



  • das umschalten der codepage kann ich im viewer vom total commander auch.
    das setzen auf 1252 bringt insofern nichts, da das "C" locale die codepage bei der ausfuehrung wieder aendern wuerde. es ist definitiv ein bug. mein report wurde inzwischen von Stephan T. Lavavej aufgenommen und als Bug gekennzeichnet. trotzdem danke fuer eure anregungen und hilfen.



  • Kannst du den Link auf den Bug-Report hier posten?



  • @Meep-Meep sagte in facet ändern:

    das umschalten der codepage kann ich im viewer vom total commander auch.
    das setzen auf 1252 bringt insofern nichts, da das "C" locale die codepage bei der ausfuehrung wieder aendern wuerde. es ist definitiv ein bug. mein report wurde inzwischen von Stephan T. Lavavej aufgenommen und als Bug gekennzeichnet.

    Es kann allerdings noch einige Zeit ins Land ziehen bis, das gefixt und auch tatsächlich verfügbar ist. Vielleicht hilft es ja die Codepage im Programm selbst zu setzen anstatt mit chcp oder sowas? Eventuell nochmal nach dem locale-Gedöns?

    Vor einiger Zeit gab es hier mal eine Diskussion zur UTF-8-Ausgabe in Windows-Konsolenprogrammen. Dort kannst du sehen, wie man die Konsolen-Codepage im Programm selbst ändert.

    Auch wenn du nicht auf UTF-8 im Speziellen hinaus willst: Meine Erkenntnis war damals auch dass da bei VS (2015 in dem Fall) bezüglich Zeichencodierungen schon noch einiges im argen liegt. Für möglichst intuitive UTF-8-Ausgabe empfahl es sich, die Datei in VS als Unicode (UTF-8 without signature) - Codepage 65001 zu speichern und gewöhnliche String-Literale ohne Präfix zu verweden.

    Ansonsten möchte ich noch erwähnen, dass die native Unicode-Codierung für Windows UTF-16 ist (im gegensatz zu Linux, wo eher UTF-8 angesagt und UTF-16 ein Exot ist). Eventuell verhält sich dein Programm ja so, wie du es erwartest, wenn du damit arbeitest (wcout, wchar_t und Codepage 65001)? Das würde zumindest theoretisch keine Umstellung der Codepage erfordern, wenn man die Locale ändert (falls es daran liegt).




Anmelden zum Antworten