如何正确解码cmd输出?

ggc*_*des 9 c# cmd

ProcessStartInfo startInfo = new ProcessStartInfo("CMD.exe");
startInfo.Arguments = "/c " + URL;
Process p = new Process();
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.CreateNoWindow = true;
p = Process.Start(startInfo);
string original = p.StandardOutput.ReadToEnd();
string result1 = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(original));
string result2 = Encoding.BigEndianUnicode.GetString(Encoding.BigEndianUnicode.GetBytes(original));
string result3 = Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(original));
string result4 = Encoding.UTF32.GetString(Encoding.UTF32.GetBytes(original));
string result5 = Encoding.UTF7.GetString(Encoding.UTF7.GetBytes(original));
string result6 = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(original));
Run Code Online (Sandbox Code Playgroud)

cmd输出包含俄语字母,无法使用我尝试的所有编码正确解码.请帮忙.

我试过了:

startInfo.StandardOutputEncoding = Encoding."all possible encodings";
Run Code Online (Sandbox Code Playgroud)

但没有帮助.

有任何想法吗?

C4d*_*C4d 19

老问题,但没有可能的正确答案.

这里是:

process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
Run Code Online (Sandbox Code Playgroud)

850标准的cmd页面.因此,使用该应用程序的用户将获得正如使用命令行本身时所期望的字符.

这个解决了德国操作系统上的所有符号问题.


OEM代码页:
437(美国)
720(阿拉伯语)
737(希腊语)
775(波罗的海)
850(多语种拉丁语I)
852(拉丁语II)
855(西里尔语)
857(土耳其语)
858(多语种拉丁语I +欧元)
862(希伯来语) )
866(俄语)

  • 要查找系统的代码页,请访问:http://stackoverflow.com/a/5911430/200443 (2认同)

Net*_*tep 11

这对我有用:

startInfo.StandardOutputEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)
Run Code Online (Sandbox Code Playgroud)


Syn*_*ror 7

首先,您需要为控制台设置正确的字体.稍稍运行应用程序(请参阅下面的第二个代码示例),单击"属性"并更改字体.

现在,您需要为三件事设置编码:在第一个应用程序中(作为子进程执行),这是控制台输出编码.在父进程应用程序中,如果要查看结果,则需要执行相同操作,还需要执行相同操作,但还需要设置标准输出编码System.Diagnostics.ProcessStartInfo.此外,如果你使用一些输入,你应该在输入中需要所有三件事.

在我的系统上,除了UTF-8之外的所有UTF都会抛出异常.让它成为:目前可能只实现了一个UTF(在我的例子中是Windows 7 Pro).

首先,让我们看看如何编写简单输出Unicode文本的应用程序:

namespace WriteAndPresentUnicode {
    using System;

    class Program {
        static void Main(string[] args) {
            Console.OutputEncoding = System.Text.Encoding.UTF8;
            Console.WriteLine("????? ??-??????..."); // "We are writing in Russian..."
        } //Main
    } //class Program

} //namespace WriteAndPresentUnicode
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看如何通过重定向输出将其作为智能流程启动:

namespace ReadUnicode {
    using System;
    using System.Diagnostics;
    using System.IO;

    class Program {

        const string application = "WriteAndPresentUnicode.exe";

        static void Main(string[] args) {
            Process myProcess = new Process();
            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(application);
            myProcessStartInfo.UseShellExecute = false;
            myProcessStartInfo.RedirectStandardOutput = true;
            myProcessStartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8; // this is the most important part, to get correct myString, see below
            myProcess.StartInfo = myProcessStartInfo;
            myProcess.Start();
            StreamReader myStreamReader = myProcess.StandardOutput;
            string myString = myStreamReader.ReadToEnd();
            myProcess.WaitForExit();
            myProcess.Close();
            Console.InputEncoding = System.Text.Encoding.UTF8;
            Console.OutputEncoding = System.Text.Encoding.UTF8;
            Console.WriteLine(myString);
            Console.WriteLine("Press any key...");
            Console.ReadKey(true);
        } //Main

    } //class Program

} //namespace ReadUnicode
Run Code Online (Sandbox Code Playgroud)

-Tested-