捕獲控制檯應用程序的輸出,當我試圖使用的System.Diagnostics.Process測試運行它來捕捉從控制檯應用程序的輸出。我在字符編碼方面遇到了麻煩。 「£」在測試中顯示爲「œ」,但是當我運行控制檯應用程序時,它正確顯示爲「£」。編碼問題在測試
如果我設置Console.Out.Encoding = Encoding.Default,它工作在測試,但正常運行時沒有正確地顯示。
這是怎麼回事,我該如何解決?
捕獲控制檯應用程序的輸出,當我試圖使用的System.Diagnostics.Process測試運行它來捕捉從控制檯應用程序的輸出。我在字符編碼方面遇到了麻煩。 「£」在測試中顯示爲「œ」,但是當我運行控制檯應用程序時,它正確顯示爲「£」。編碼問題在測試
如果我設置Console.Out.Encoding = Encoding.Default,它工作在測試,但正常運行時沒有正確地顯示。
這是怎麼回事,我該如何解決?
您需要設置StandardOutputEncoding
您ProcessStartInfo
對象在你的測試用例:
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");
我遇到過這個問題。我將輸出重定向到一個文件並從cmd提示符運行,但我希望輸出保持UTF-8編碼。有沒有辦法在命令窗口中設置它?因爲我不是通過另一個C#應用程序啓動該進程。謝謝 – 2015-03-05 13:50:05
@ChrisWalsh請參閱http://stackoverflow.com/questions/388490/unicode-characters-in-windows-command-line-how? 'chcp 65001' – wal 2015-03-05 23:36:58
我認爲你是在正確的軌道上。 作爲測試我執行該代碼:
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),儘管我不知道當然。
你怎麼從你的測試跑步者運行你的控制檯應用程序? – wal 2012-01-28 08:43:05