2012-01-27 96 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),儘管我不知道當然。