我正在尝试通过使用System.Diagnostics.Process在测试中运行它来捕获控制台应用程序的输出。我遇到字符编码问题。 “£”在测试中显示为“œ”,但是当我运行控制台应用程序时,它显示为“£”。
如果我设置Console.Out.Encoding = Encoding.Default,它在测试中有效,但在正常运行时无法正常显示。
这里发生了什么,我该如何解决?
答案 0 :(得分:5)
您需要在测试用例中的StandardOutputEncoding
对象上设置ProcessStartInfo
:
var process = new Process();
var startInfo = new ProcessStartInfo(@"yourapp.exe");
startInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
您可以通过运行
在控制台应用中找到您正在使用的CodePageConsole.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),但我不知道当然。