gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:26:11 36 4
gpt4 key购买 nike

可以使用 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,所以这完全取决于您调用的程序是如何编写的。

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

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

Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args));

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

关于c# - Process.StartInfo.Arguments 是否支持 UTF-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2627891/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com