您可以使用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支持,或者这是不支持的?
答案 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)