Search code examples
c#visual-studioconsoleprocess.startc#-interactive

Visual Studio C# Interactive Console Output wrongly interpreted


Whenever I use Process.Start in the C# Interactive window of Visual Studio, and execute an outside command which outputs info to the console, it gets printed as seeminlgy Chinese characters.

I tried searching for similar problems online (which I found none of). I expect it to print the console output as it would be printed in the console (so with the normal alphabet, instead of Chinese-looking characters).

I tried to use Process.Start("ping") in the C# Interactive window, which results in the wrongly displayed text.

If I use the same code in a normal C# program, it displays the output just fine in a Windows console which opens separately.

Example

When I use:

Process.Start("ping");

The output is:

਍祓瑮硡›楰杮嬠琭⁝ⵛ嵡嬠渭挠畯瑮⁝ⵛ楳敺⁝ⵛ嵦嬠椭吠䱔⁝ⵛ⁶佔嵓਍††††††嬠爭挠畯瑮⁝ⵛ⁳潣湵嵴嬠ⵛ潨瑳氭獩嵴簠嬠欭栠獯⵴楬瑳嵝਍††††††嬠眭琠浩潥瑵⁝ⵛ嵒嬠匭猠捲摡牤⁝ⵛ⁣潣灭牡浴湥嵴嬠瀭൝ ††††††ⵛ崴嬠㘭⁝楚汥慮敭਍਍灏楴湯湥ഺ †ⴠ⁴††††††楐杮⁴敤湡敧敧敢敮潈瑳戠獩稠牵䈠敥摮杩湵⁧敤⁳潖杲湡獧മ †††††††††牄掁敫楓⁥呓䝒唫呎剂‬浵搠敩匠慴楴瑳歩愠穮穵楥敧湵൤ †††††††††敤潖杲湡⁧潦瑲畺敳穴湥മ †††††††††牄掁敫楓⁥呓䝒䌫‬浵搠湥嘠牯慧杮愠穢扵敲档湥മ †ⴠ⁡††††††鑌瑳䄠牤獥敳畺䠠獯湴浡湥愠晵മ †ⴠ潣湵⁴†††楄⁥湁慺汨搠牥稠⁵敳摮湥敤捅潨湡潦摲牥湵敧⹮਍††氭猠穩⁥†††䐠敩䜠鑲旡搠獥匠湥敤異晦牥⹳਍††昭††††††䰠来⁴慤⁳敋湮敺捩敨腦⁲丢捩瑨映慲浧湥楴牥湥•浩倠歡瑥਍†††††††††映獥⁴渨牵䤠癐⤴മ †ⴠ⁩呔⁌††††楄⁥敌敢獮慤敵⹲਍††瘭吠协††††䐠牥䐠敩獮瑴灹⠠畮⁲偉㑶‮楄獥⁥楅獮整汬湵⁧獩⁴敶慲瑬瑥਍†††††††††甠摮栠瑡欠楥敮䄠獵楷歲湵敧畡⁦慤⁳楄湥瑳祴晰汥⁤浩䤠ⵐ਍†††††††††䠠慥敤⥲മ †ⴠ⁲潣湵⁴†††慄整獮瑡牺畯整映犁䄠穮桡潶潈獰⠠畮⁲偉㑶⸩਍††猭挠畯瑮†††娠楥獴整灭汥映犁䄠穮桡潶潈獰⠠畮⁲偉㑶⸩਍††樭栠獯⵴楬瑳†∠潌獯⁥潓牵散删畯整•敧葭⃡潈瑳楬瑳⁥渨牵䤠癐⤴മ †ⴠ潨瑳氭獩⁴†匢牴捩⁴潓牵散删畯整•敧葭⃡潈瑳楬瑳⁥渨牵䤠癐⤴മ †ⴠ⁷楴敭畯⁴††敚瑩楬業⁴湩䴠汩楬敳畫摮湥映犁搠敩攠湩敺湬湥䄠瑮潷瑲湥മ †ⴠ⁒††††††敖睲湥敤⁴敤潒瑵湩桧慥敤Ⱳ甠畡档搠敩甠杭步桥瑲⁥潒瑵൥ †††††††††畺琠獥整渨牵䤠癐⤶മ †††††††††楄獥牥删畯楴杮敨摡牥眠物⁤楮档⁴敭牨瘠牥敷摮瑥਍†††††††††⠠楳桥⁥䙒⁃〵㔹⸩䈠楥洠湡档湥匠獹整敭敷摲湥਍†††††††††䔠档慯普牯敤畲杮湥瘠牥潷晲湥‬敷湮਍†††††††††搠敩敳⁲效摡牥瘠牥敷摮瑥眠物⹤਍††匭猠捲摡牤††䐠敩稠⁵敶睲湥敤摮⁥畑汥慬牤獥敳മ †ⴠ⁣潣灭牡浴湥⁴潒瑵湩摧灥瑯敢敺捩湨牥਍††瀭††††††倠湩瑧搠敩䄠牤獥敳攠湩獥䄠扮敩整獲映犁搠敩਍†††††††††䠠灹牥嘭中瑥睺牥癫物畴污獩敩畲杮മ †ⴠ‴††††††牅睺湩瑧搠敩嘠牥敷摮湵⁧潶偉㑶മ †ⴠ‶††††††牅睺湩瑧搠敩嘠牥敷摮湵⁧潶偉㙶മഊ

Which should be (if you run ping in the console):

Syntax: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
             [-r count] [-s count] [[-j host-list] | [-k host-list]]
             [-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]
             [-4] [-6] Zielname

Optionen:
    -t             Pingt den angegebenen Host bis zur Beendigung des Vorgangs.
                   Drücken Sie STRG+UNTBR, um die Statistik anzuzeigen und
                   den Vorgang fortzusetzen.
                   Drücken Sie STRG+C, um den Vorgang abzubrechen.
    -a             Löst Adressen zu Hostnamen auf.
    -n count       Die Anzahl der zu sendenden Echoanforderungen.
    -l size        Die Größe des Sendepuffers.
    -f             Legt das Kennzeichen für "Nicht fragmentieren" im Paket
                   fest (nur IPv4).
    -i TTL         Die Lebensdauer.
    -v TOS         Der Diensttyp (nur IPv4. Diese Einstellung ist veraltet
                   und hat keine Auswirkungen auf das Diensttypfeld im IP-
                   Header).
    -r count       Datensatzroute für Anzahl von Hops (nur IPv4).
    -s count       Zeitstempel für Anzahl von Hops (nur IPv4).
    -j host-list   "Loose Source Route" gemäß Hostliste (nur IPv4).
    -k host-list   "Strict Source Route" gemäß Hostliste (nur IPv4).
    -w timeout     Zeitlimit in Millisekunden für die einzelnen Antworten.
    -R             Verwendet den Routingheader, um auch die umgekehrte Route
                   zu testen (nur IPv6).
                   Dieser Routingheader wird nicht mehr verwendet
                   (siehe RFC 5095). Bei manchen Systemen werden
                   Echoanforderungen verworfen, wenn
                   dieser Header verwendet wird.
    -S srcaddr     Die zu verwendende Quelladresse.
    -c compartment Routingdepotbezeichner
    -p             Pingt die Adresse eines Anbieters für die
                   Hyper-V-Netzwerkvirtualisierung.
    -4             Erzwingt die Verwendung von IPv4.
    -6             Erzwingt die Verwendung von IPv6.

Solution

  • After my test, you need to initialize this tool first, just double-click the following:

    enter image description here Then enter the C# Interactive window. It is wrong to directly use the Process.Start("ping") command. You need to use the following code in the C# Interactive window:

    var startInfo = new ProcessStartInfo
    {
       FileName = "ping",
       Arguments = "",
       RedirectStandardOutput = true,
       UseShellExecute = false,
       CreateNoWindow = true,
    };
     
    using (var process = Process.Start(startInfo))
    {
       using (var reader = process.StandardOutput)
       {
           string result = reader.ReadToEnd();
           Console.WriteLine(result);
       }
    }
    

    This will achieve what you want:

    enter image description here