18
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));

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

我试过了:

startInfo.StandardOutputEncoding = Encoding."all possible encodings";

但没有帮助。

有任何想法吗?

4

5 回答 5

28

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

这里是:

process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);

850标准的 cmd-page。因此,使用该应用程序的用户将获得字符,就像他在使用命令行本身时所期望的那样。

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


OEM 代码页:

437 - 英语
708 - 阿拉伯语 (ASMO)
720 - 阿拉伯语 (Microsoft)
737 - 希腊语
775 - 波罗的海
850 - 西欧(多语种拉丁语 I)
852 - 中欧语(拉丁语 II)
855 - 西里尔语
857 - 土耳其语
858 - 西欧语(多语种)拉丁语 I + 欧元)
860 - 葡萄牙语
861 - 冰岛语
862 - 希伯来语
863 - 加拿大法语
864 - 阿拉伯语 (IBM)
865 - 北欧语
866 - 俄罗斯语
869 - 希腊语
1254- 土耳其语

于 2014-09-24T11:16:33.940 回答
12

这对我有用:

startInfo.StandardOutputEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)
于 2018-01-25T05:47:27.950 回答
10

首先,您需要为您的控制台设置正确的字体。暂停运行应用程序一次(参见下面的第二个代码示例),单击“属性”并更改字体。

现在,您需要为三件事设置编码:在第一个应用程序中(作为子进程执行),这是控制台输出编码。在父进程应用程序中,如果要查看结果,也需要这样做,需要这样做,但还需要在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

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

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

-经过测试-

于 2013-05-29T00:58:25.450 回答
4

如果控制台应用程序是您的,那么使用 UTF8 编码编写控制台的解决方案很好。但是,如果您使用诸如“netsh”之类的标准 Windows 实用程序,则无济于事。
标准 cmd 代码页是 OEM。
例如俄语:

process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
process.StartInfo.StandardErrorEncoding = Encoding.GetEncoding(866);

OEM 代码页:

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

于 2015-07-09T12:48:45.807 回答
1

如果没有其他帮助,试试这个!

经过大量的尝试和痛苦,我发现:无论您的输出流如何 UTF8,无论您如何设置 65001,在您在子进程中启动子进程之前,一切都将无法正常工作。听起来很傻,但却是真的。

看:

chcp 65001 && dir             // nope, still 437
chcp 65001 && cmd /c dir      // correct UTF8

希望这至少可以为您节省与我悲惨生活一样多的时间!

于 2018-01-06T23:06:35.980 回答