在测试中捕获控制台应用程序输出时的编码问题

时间:2012-01-27 23:49:58

标签: c# encoding console-application system.diagnostics

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

如果我设置Console.Out.Encoding = Encoding.Default,它在测试中有效,但在正常运行时无法正常显示。

这里发生了什么,我该如何解决?

2 个答案:

答案 0 :(得分:5)

您需要在测试用例中的StandardOutputEncoding对象上设置ProcessStartInfo

var process = new Process();
var startInfo = new ProcessStartInfo(@"yourapp.exe");
startInfo.StandardOutputEncoding = Encoding.GetEncoding(850);

您可以通过运行

在控制台应用中找到您正在使用的CodePage
Console.WriteLine(Console.Out.Encoding.CodePage); 

返回850(西欧DOS)

您还可以使用BodyName属性作为GetEncoding的arg:

startInfo.StandardOutputEncoding = Encoding.GetEncoding("ibm850");

答案 1 :(得分:1)

我认为你走在正确的轨道上。 作为测试我执行了这段代码:

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