Konsolen-Ausgaben unter Windows 7 und 8.1 (Encoding)



  • Ich habe Programme, die als Konsolenprogramm Texte über Console.WriteLine ausgeben bzw. als Fenster-Programm in einer RichTextBox. Bei Windows 10 und 11 ist die Ausgabe OK, bei Win7 und 8.1 (beide in einer VM) werden über Console bestimmte UTF-8 Zeichen nicht korrekt ausgegeben
    So sollte die Ausgabe aussehen

    grünem
    Gras
    Windows
    €
    Ein
    fröhliches
    E
    

    und so sieht es aus
    Link Text

    Im Konsolen-Programm führe ich vor der ersten Konsolen-Ausgabe folgende Befehle aus

    Console.OutputEncoding = Encoding.Default;
    Console.InputEncoding  = Encoding.Default;
    

    Ich habe es auch mit

    Encoding.UTF8
    

    versucht, da kommt der gleiche Fehler.
    Ich habe extra VS2022 in der vm-Win8.1 installiert und dort im Debugger nachgeschaut, da sind die Code intern im Speicher alle OK, nur die Ausgabe per Console.WriteLine ist fehlerhaft.

    Die Standard/aktive Codepage, die man in einem CMD-Fender mit CHCP anzeigen kann, ist sowohl bei Win7, 8.1 aber auch 10 und 11 jeweils CP 850.

    Muss bei diesen Befehlen statt Default etwas anderes angegeben werden - oder geht das prinzipiell bei WIn7 und 8.1 mit einem VS2022-Programm nicht.

    Console.OutputEncoding = Encoding.Default;
    Console.InputEncoding  = Encoding.Default;
    

    Als Zielframework ist => .NET Framework 4.8 eingestellt.
    Muss dort für Win7 und 8.1 etwas früheres stehen ?

    Müsste ich mal VS2010 installieren, das habe ich auch noch...



  • Wie startest du denn den Programm? Öffnest du erst die Konsole per CMD und führst dann deine Anwendung aus?
    Ich weiß nicht wie man die C# Anwendung dazu bringt, das aktuelle Encoding der Konsole zu benutzen, aber du kannst der Konsole mit chcp [nnn] sagen, dass sie eine bestimmte CodePage für die Ein- und Ausgabe benutzen soll. Die ID für UTF-8 ist 65001, probier mal bitte ```chcp 65001````. Ist natürlich doof, wenn man das immer manuell nach jedem Start der Konsole machen muss.



  • Hallo DocShoe,
    mit CHCP 65001 und CHCP 850 usw. habe ich gemacht.
    Bei Windows 10 und 11 klappt das auch,
    aber bei WIndows 8.1 und 7 zeigt das keine Wirkung.

    Ich habe mal ein ganz kleines Programm unter Win8.1 mit VS2022 gemacht:

    using System;
    
    namespace ConsoleNET472Vm81
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                string Text = 
                    "Fröhliches Ostern\n" +
                    "auf der grünen Wiese\n" +
                    "Eintritt: 5,00 €\n" +
                    "x²+y² = z²\n" +
                    "2³ = 8\n"+
                    "äöüß AÖÜ € @ °";
                Console.WriteLine(Text);    
                Console.ReadLine();
            }
        }
    }
    

    Da werden alle Zeichen richtig angezeigt, außer dem "€" Euro, dafür wird ein ? ausgegeben.
    Wenn ich das Programm in einem CMD-Fenster mit vorherigem CHCP 65001 starte,
    da wird alles korrekt ausgegeben, auch das €-Zeichen.

    Bei Windows 10 ist es ganz genau so.

    Man darf also die beiden Befehle

    Console.OutputEncoding = Encoding.Default;
    Console.InputEncoding  = Encoding.Default;
    

    nicht ausführen unter Windows 8.1.
    Bei Win 10 und 11 müssen sie sein, damit die Ausgabe stimmt.

    So sieht es bei Win10 aus, da muss cp 65001 nicht angegeben werden, trotzdem wird das €-Zeichen richtig ausgegeben. VS fügt die Anweisung

    using System.Text; 
    

    ein.

    using System;
    using System.Text;
    
    namespace ConsoleNET472Vm81
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                string Text = 
                    "Fröhliches Ostern\n" +
                    "auf der grünen Wiese\n" +
                    "Eintritt: 5,00 €\n" +
                    "x²+y² = z²\n" +
                    "2³ = 8\n"+
                    "äöüß AÖÜ € @ °";
    
                Console.OutputEncoding = Encoding.Default;
                Console.InputEncoding = Encoding.Default;
    
                Console.WriteLine(Text);    
                Console.ReadLine();
            }
        }
    }
    
    


  • @DocShoe sagte in Konsolen-Ausgaben unter Windows 7 und 8.1 (Encoding):

    Wie startest du denn den Programm?

    Jetzt habe ich es gefunden - das wusste ich eigentlich schon von einem anderen Programm, habe aber nicht gleich daran gedacht.....

    CHCP 65001 - ist die eine Sache.

    ABER => man muss im CMD-Fenster bei WIndows 7 und 8.1 die Schriftart auf eine umstellen, die auch UTF8 darstellen kann.

    Voreingestellt ist = Rasterschriftart.
    Das muss man ändern in => Lucia Console

    Mein kleines Testprogramm sieht jetzt so aus und funktioniert:

    using System;
    using System.Reflection;
    using System.Text;
    using System.Management;
    
    namespace ConsoleNET472Vm81
    {
        internal class Program
        {
            public static int WinVer = 0; //Windows-Version = 7, 81, 10, 11 oder 0 = nicht erkannt
    
            static void Main(string[] args)
            {
                WinVer = GetOperatingSystem(); //Windows-Version = 7, 81, 10, 11 oder 0 = nicht erkannt
    
                string Text = 
                    "Fröhliches Ostern\n" +
                    "auf der grünen Wiese\n" +
                    "Eintritt: 5,00 €\n" +
                    "x²+y² = z²\n" +
                    "2³ = 8\n"+
                    "äöüß AÖÜ € @ °";
    
                if ((WinVer == 10) || (WinVer == 11))
                {
                    Console.OutputEncoding = Encoding.Default;
                    Console.InputEncoding = Encoding.Default;
                }
    
                Console.WriteLine(Text);    
                Console.ReadLine();
    
            } // Main
    
            //===================================================================
            // Ermitteln, unter welchem Windows das Programm läuft
            //===================================================================
            static int GetOperatingSystem()
            {
                ManagementScope scope = new ManagementScope("root\\CIMV2");
                SelectQuery query = new SelectQuery("Win32_OperatingSystem");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
                foreach (ManagementObject item in searcher.Get())
                {
                    string sCaption = (string)item.Properties["Caption"].Value; // Operating System
    
                    if (sCaption.Contains("Microsoft Windows 11")) return 11;
                    if (sCaption.Contains("Microsoft Windows 10")) return 10;
                    if (sCaption.Contains("Microsoft Windows 8.1")) return 81;
                    if (sCaption.Contains("Microsoft Windows 7")) return 7;
                }
                return 0; // kein Windows 7, 8.1, 10 oder 11 gefunden
    
            } // GetOperatingSystem()
        }
    }
    

    Und schon können UTF8-Zeichen, wie das €-Zeichen angezeigt werden.

    Auch unter Windows 7 klappt es...

    Link Text


Anmelden zum Antworten