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

本文关键字:编码 问题 输出 应用程序 测试 控制台 | 更新日期: 2023-09-27 18:21:46

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

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

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

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

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

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的参数,即:

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

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

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),尽管我不能确定。