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

Pat*_*lug 12 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();
Run Code Online (Sandbox Code Playgroud)

执行此操作似乎松开了UTF-8字符串,所有目标应用程序看到的都是"echo ?????????"

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

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

Sim*_*han 5

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

Arguments = "/U /K \"echo ????????> output.txt\"";
Run Code Online (Sandbox Code Playgroud)

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

一些背景信息:使用"窄"(系统代码页)入口点的C或C++程序,例如main(int argc, char** argv),而不是"宽"(UTF-16)入口点,wmain(int argc, wchar_t** argv)由将命令行转换为系统代码页 - 不能是UTF-8.

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

Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args));
Run Code Online (Sandbox Code Playgroud)

Caveat Coder:如果在你或别人的机器上出现可怕的错误,请不要感到惊讶,这取决于当前系统代码页中每个可能的字节是否有效,系统代码页与你的程序启动时没有什么不同,程序你正在运行不使用任何编码依赖Windows功能的数据(具有A,W后缀版本的那些),依此类推.


Han*_*ant 3

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

如果这不是日语代码页,则该翻译会产生问号,因为日语字形只有日语代码页中的代码。对于非日语使用者来说,切换系统代码页通常不太理想。Utf8 肯定不会工作,程序不会期望它们。考虑在虚拟机中运行该程序。