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)
但没有帮助.
有任何想法吗?
我想从我的C#项目中的另一个应用程序的标准输出流中解析UTF8字符.使用默认方法,从进程的标准输出流中读取时,ANSI范围之外的字符会被破坏.
现在根据微软的说法,我需要做的是设置StandardOutputEncoding:
如果StandardOutputEncoding属性的值为Nothing,则进程将使用标准输出的默认标准输出编码.必须在启动进程之前设置StandardOutputEncoding属性.设置此属性不保证进程将使用指定的编码.应测试应用程序以确定进程支持的编码.
但是,尝试将StandardOutputEncoding设置为UTF8/CP65001时输出为read,当转储到二进制文件时,显示相同的外语字符阉割.它们总是被读作'?' (又名0x3F)而不是他们应该是什么.
我知道此时的假设是我正在解析的输出的应用程序根本就不发送UTF8输出,但是当我尝试将应用程序的输出从命令行转储到文件后绝对不是这种情况.强制命令提示的代码页为65001,一切看起来都很好.
chcp 65001 && slave.exe > file.txt
Run Code Online (Sandbox Code Playgroud)
通过这个,我知道应用程序slave.txt能够吐出UTF8编码的标准输出,但是尽可能地尝试,我无法让StandardOutputEncoding在我的C#应用程序中做同样的事情.
每当我最终处理.NET中的编码时,我希望我回到C++世界,所有需要更多工作的东西,但是更加透明.我正在考虑编写一个C应用程序来将slave.txt的输出读入一个准备好进行C#解析的UTF8编码的文本文件,但我现在暂时不采取这种方法.