繁体   English   中英

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

[英]Does Process.StartInfo.Arguments support a UTF-8 string?

您可以使用 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 支持,还是只是不支持?

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

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

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

一些背景信息:使用“narrow”(系统代码页)入口点的 C 或 C++ 程序,例如main(int argc, char** argv) ,而不是“wide”(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));

警告编码器:如果这在您或其他人的机器上出现严重错误,请不要感到惊讶,这取决于当前系统代码页中每个可能的字节都是有效的,系统代码页与您的程序启动时没有不同,您的程序正在运行不使用数据到任何编码相关的 Windows 函数(那些带有 A、W 后缀的版本),等等。

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

如果那不是日语代码页,则该翻译会产生问号,因为日语字形在日语代码页中只有一个代码。 对于不会说日语的人来说,切换系统代码页通常不是很理想。 utf8 肯定行不通,程序不会期待它们。 考虑在虚拟机中运行这个程序。

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

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

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

看看这里

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM