2010-04-13 117 views
8

你可以使用一個UTF-8字符串作爲StartInfo的參數嗎?Process.StartInfo.Arguments是否支持UTF-8字符串?

我想通過一個UTF-8(在這種情況下是一個日文字符串)作爲控制檯參數的應用程序。

像這樣的東西(這只是一個例子!(cmd.exe的將是一個自定義應用程序))

var process = new System.Diagnostics.Process(); 
process.StartInfo.Arguments = "/K \"echo これはテストです\""; 
process.StartInfo.FileName = "cmd.exe"; 
process.StartInfo.UseShellExecute = true; 

process.Start(); 
process.WaitForExit(); 

執行這個看似鬆散的UTF-8字符串和所有的目標應用程序看到的是「回聲?????????「

當直接在命令行上執行此命令(通過粘貼參數)時,即使命令行本身似乎無法正確顯示,目標應用程序也會正確接收該字符串。

我是否需要做任何特殊的事情來在參數中啓用UTF-8支持,或者這只是不受支持?

回答

1

它完全取決於您嘗試啓動的程序。 Process類完全支持Unicode,就像操作系統一樣。但該程序可能比較舊,並使用8位字符。它將使用GetCommandLineA()來檢索命令行參數,本地Unicode GetCommandLineW()API函數的ANSI版本。並且使用系統默認代碼頁將Unicode字符串轉換爲8位字符,如控制面板+區域和語言選項,非Unicode程序的語言中配置。 WideCharToMultiByte()使用CP_ACP。

如果這不是日文代碼頁,那麼由於日文字形只在日文代碼頁中有代碼,該翻譯會生成問號。切換系統代碼頁通常不是非常需要的非日語用戶。 Utf8肯定不會工作,該計劃不會期望他們。考慮在虛擬機中運行該程序。

1

我剛剛創建了一個Windows Forms應用程序,該應用程序在RichTextBox中顯示Environment.CommandLine,並且字符串顯示正確,因此可以通過這種方式傳遞Unicode字符串。

我想我的操作系統默認使用代碼頁1252,因此即使粘貼像你這樣的參數,我也不能在命令提示符中顯示這些字符。

+0

是否通過使用Process和ProcessStartInfo啓動應用程序或直接從命令行將參數傳遞到應用程序? – 2010-04-13 10:18:40

+0

我使用了Process/ProcessStartInfo - 我只將「cmd.exe」更改爲「test.exe」,這是我的WinForms應用程序。 – 2010-04-13 11:20:49

0

使用的字符串[System.String或普通string]是基於Unicode的。所以,是的,他們可以承受上述編碼。

看一看here

您需要檢查OS相關設置(代碼頁,語言等)

+0

我知道字符串支持unicode - 我只是不確定ProcessStartInfo上的Arguments屬性是否正確地將它傳播到正在執行的應用程序。它似乎不是。 – 2010-04-13 10:17:19

4

程序接受他們的命令行中的UTF-16,同樣的編碼作爲.NET字符串:

Arguments = "/U /K \"echo これはテストです> output.txt\""; 

這是控制檯窗口,它不能顯示當前代碼頁/選定字體以外的字符。不過,我假設你不想調用echo,所以這完全取決於你所調用的程序是如何寫入的。

一些背景信息:使用「窄」(系統代碼頁)入口點(例如main(int argc, char** argv))而不是「寬」(UTF-16)入口點wmain(int argc, wchar_t** argv)的C或C++程序由存根將命令行轉換爲系統代碼頁 - 不能是UTF-8。

到目前爲止,最好的選擇是將程序更改爲使用寬入口點,並簡單地獲得與.NET字符串中相同的UTF-16。如果這是不可能的,那麼一招,你可以嘗試將它傳遞一個UTF-16命令行,當轉換爲系統代碼頁是UTF-8爲您希望使用的字符:

Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args)); 

買者編碼器:如果在你的或其他人的機器上出現可怕的錯誤,請不要感到驚訝,這取決於當前系統代碼頁中每個可能的字節是否有效,系統代碼頁與程序啓動時沒有區別,正在運行的程序不使用任何編碼相關的Windows函數(具有A,W後綴版本的數據)等等。

+0

是的,我可以看到程序以unicode接收他們的命令行,但我不知道的是Process類的StartInfo.Arguments是否可以將值傳播到unicode中的應用程序。在我的測試中,似乎沒有。 – 2010-04-13 10:24:40

+0

@Patrick:完全精確的是,當一個程序啓動時,它從Windows接收的原始值始終爲Unicode。根據它的寫法,可能會在它看到它之前將其轉換爲系統代碼頁。 – 2010-04-13 10:30:23

+0

如果使用'main'作爲入口點,則仍然可以使用GetCommandLine(http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx)獲取UTF-16參數。這就是Qt的QCoreApplication在Windows上的工作原理。 – Patrick 2014-03-13 20:26:35

相關問題