捕获控制台应用程序的输出,当我试图使用的System.Diagnostics.Process测试运行它来捕捉从控制台应用程序的输出。我在字符编码方面遇到了麻烦。 “£”在测试中显示为“œ”,但是当我运行控制台应用程序时,它正确显示为“£”。编码问题在测试
如果我设置Console.Out.Encoding = Encoding.Default,它工作在测试,但正常运行时没有正确地显示。
这是怎么回事,我该如何解决?
捕获控制台应用程序的输出,当我试图使用的System.Diagnostics.Process测试运行它来捕捉从控制台应用程序的输出。我在字符编码方面遇到了麻烦。 “£”在测试中显示为“œ”,但是当我运行控制台应用程序时,它正确显示为“£”。编码问题在测试
如果我设置Console.Out.Encoding = Encoding.Default,它工作在测试,但正常运行时没有正确地显示。
这是怎么回事,我该如何解决?
您需要设置StandardOutputEncoding
您ProcessStartInfo
对象在你的测试用例:
var process = new Process();
var startInfo = new ProcessStartInfo(@"yourapp.exe");
startInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
你可以找到代码页使用的是在您的控制台应用程序是什么运行
Console.WriteLine(Console.Out.Encoding.CodePage);
返回850 (西欧DOS)
您也可以使用BodyName
属性作为对Arg的GetEncoding
那是:
startInfo.StandardOutputEncoding = Encoding.GetEncoding("ibm850");
我遇到过这个问题。我将输出重定向到一个文件并从cmd提示符运行,但我希望输出保持UTF-8编码。有没有办法在命令窗口中设置它?因为我不是通过另一个C#应用程序启动该进程。谢谢 – 2015-03-05 13:50:05
@ChrisWalsh请参阅http://stackoverflow.com/questions/388490/unicode-characters-in-windows-command-line-how? 'chcp 65001' – wal 2015-03-05 23:36:58
我认为你是在正确的轨道上。 作为测试我执行该代码:
Console.WriteLine(Encoding.Default.EncodingName);
Console.WriteLine(Console.Out.Encoding.EncodingName);
当作为控制台应用程序它输出运行:
Western European (Windows) OEM United States
当作为Windows应用程序它输出运行:
Western European (Windows) Western European (Windows)
我怀疑从测试运行器的控制台输出读取时,您需要设置读取器的编码以匹配输出编码的编码,可能是西欧(Windows),尽管我不知道当然。
你怎么从你的测试跑步者运行你的控制台应用程序? – wal 2012-01-28 08:43:05