Process.StartInfo.Arguments是否支持UTF-8字符串?

时间:2010-04-13 08:03:08

标签: c# utf-8

您可以使用UTF-8字符串作为StartInfo的参数吗?

我正在尝试将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字符串,所有目标应用程序看到的都是“echo ??????????”

直接在命令行上执行此命令(通过粘贴参数),目标应用程序正确接收字符串,即使命令行本身似乎没有正确显示它。

我是否需要做一些特殊的事情才能在参数中启用UTF-8支持,或者这是不支持的?

4 个答案:

答案 0 :(得分:5)

程序以UTF-16接收命令行,编码与.NET字符串相同:

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

控制台窗口无法显示当前代码页/所选字体之外的字符。但是,我假设你不想调用echo,所以这完全取决于你所调用的程序是如何编写的。

一些背景信息:使用'narrow'(系统代码页)入口点的C或C ++程序,例如main(int argc, char** argv),而不是'wide'(UTF-16)入口点,{{1}由存根控制,将命令行转换为系统代码页 - 不能是UTF-8。

到目前为止,最好的选择是将程序更改为使用宽入口点,并且只需获得与.NET字符串中相同的UTF-16。如果那是不可能的,那么你可以尝试的一个技巧就是传递一个UTF-16命令行,当转换为系统代码页时,你需要它使用的字符是UTF-8:

wmain(int argc, wchar_t** argv)

警告编码器:如果你或其他人的机器出现严重错误,请不要感到惊讶,这取决于当前系统代码页中每个可能的字节是否有效,系统代码页与程序启动时没有区别,您正在运行的程序不将数据用于任何依赖于编码的Windows功能(带有A,W后缀的版本),依此类推。

答案 1 :(得分:3)

这完全取决于您尝试启动的程序。 Process类完全支持Unicode,操作系统也是如此。但该程序可能是旧的并使用8位字符。它将使用GetCommandLineA()来检索命令行参数,即本机Unicode GetCommandLineW()API函数的ANSI版本。并且使用控制面板+区域和语言选项,非Unicode程序的语言中配置的系统默认代码页将Unicode字符串转换为8位字符。 WideCharToMultiByte()使用CP_ACP。

如果那不是日语代码页,那么该翻译会产生问号,因为日语字形只有日语代码页中的代码。对于非日语的人来说,通常不希望切换系统代码页。 Utf8肯定不行,该程序不会指望它们。考虑在虚拟机中运行该程序。

答案 2 :(得分:1)

我刚创建了一个Windows窗体应用程序,它在RichTextBox中显示Environment.CommandLine,并且字符串显示正确,因此可以通过这种方式传递Unicode字符串。

我认为我的操作系统默认使用代码页1252,因此即使在粘贴参数时也无法在命令提示符中显示这些字符。

答案 3 :(得分:0)

使用[System.String或普通string]的字符串是基于Unicode的。所以,是的,他们可以维持上面提到的编码。

看看here

您需要检查与操作系统相关的设置(代码页,语言等)