2012-01-27 103 views
5

捕获控制台应用程序的输出,当我试图使用的System.Diagnostics.Process测试运行它来捕捉从控制台应用程序的输出。我在字符编码方面遇到了麻烦。 “£”在测试中显示为“œ”,但是当我运行控制台应用程序时,它正确显示为“£”。编码问题在测试

如果我设置Console.Out.Encoding = Encoding.Default,它工作在测试,但正常运行时没有正确地显示。

这是怎么回事,我该如何解决?

+0

你怎么从你的测试跑步者运行你的控制台应用程序? – wal 2012-01-28 08:43:05

回答

4

您需要设置StandardOutputEncodingProcessStartInfo对象在你的测试用例:

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"); 
+0

我遇到过这个问题。我将输出重定向到一个文件并从cmd提示符运行,但我希望输出保持UTF-8编码。有没有办法在命令窗口中设置它?因为我不是通过另一个C#应用程序启动该进程。谢谢 – 2015-03-05 13:50:05

+1

@ChrisWalsh请参阅http://stackoverflow.com/questions/388490/unicode-characters-in-windows-command-line-how? 'chcp 65001' – wal 2015-03-05 23:36:58

0

我认为你是在正确的轨道上。 作为测试我执行该代码:

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),尽管我不知道当然。