2010-04-13 125 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