Process.StartInfo.Arguments支持UTF-8字符串吗?可以使用UTF-8字符串作为StartInfo的参数吗?我正在尝试将UTF-8(在本例中为日文字符串)作为控制台参数传递给应用程序。像这样的东西(这只是一个例子!(cmd.exe将是一个自定义应用程序))varprocess=newSystem.Diagnostics.Process();process.StartInfo.Arguments="/K"echoこレハテストドす"";process.StartInfo.FileName="cmd.exe";process.StartInfo.UseShellExecute=true;过程。开始();过程.WaitForExit();这样做似乎松散了UTF-8字符串,所有目标应用程序看到的所有内容都是“echo????????”直接在命令行上执行此命令(通过粘贴参数)目标应用程序正确接收字符串,即使命令行本身似乎没有正确显示它。我是否需要做一些特殊的事情来在参数中启用UTF-8支持,或者这是否不受支持?这完全取决于您要启动的程序。Process类完全支持Unicode,操作系统也是如此。但该程序可能是旧的并且使用8位字符。它将使用GetCommandLineA()检索命令行参数,即本机UnicodeGetCommandLineW()API函数的ANSI版本。并且在控制面板+区域和语言选项中配置的系统默认代码页,非Unicode程序的语言将Unicode字符串转换为8位字符。WideCharToMultiByte()使用CP_ACP。如果那不是日文代码页,那么该翻译会产生问号,因为日文字形只有日文代码页中的代码。对于非日语使用者,切换系统代码页通常是不可取的。Utf8当然不会工作,程序不会依赖它们。考虑在虚拟机中运行这个程序。该程序接收UTF-16中的命令行,与.NET字符串的编码相同:Arguments="/U/K"echoこれはテストドす>output.txt"";控制台窗口无法显示除.以外的当前代码页/所选字体字符。但是,我假设您不想调用echo,所以这完全取决于您调用的程序是如何编写的。一些背景信息:使用“窄”(系统代码页)入口点的C或C++程序,例如main(intargc,char**argv),而不是“宽”(UTF-16)入口点,wmain(intargc,wchar_t**argv)由将命令行转换为系统代码页的存根调用-不能是UTF-8。到目前为止,最好的选择是更改程序以使用宽入口点并获得与.NET字符串中相同的UTF-16。如果那不可能,那么您可以尝试的一个技巧是传递UTF-16命令行,当转换为系统代码页时,对于您希望它使用的字符,它是UTF-8:Arguments=Encoding。Default.GetString(Encoding.UTF8.GetBytes(args));CaveatCoder:如果你的机器或其他人的机器出现严重错误,请不要感到惊讶,这取决于每个可能的字节是否都在当前系统代码页中有效地,系统代码页与程序启动时没有区别,程序您正在运行的Windows功能(带有A、W后缀版本的那些)等不使用任何编码相关数据。我刚刚创建了一个在RichTextBox中显示Environment.CommandLine的Windows窗体应用程序,并且字符串显示正确,因此可以通过这种方式传递Unicode字符串。我认为我的操作系统默认使用代码页1252,因此即使在粘贴参数时我也无法在命令提示符中显示这些字符。使用的字符串[System.String或纯字符串]基于Unicode。所以,是的,他们可以保持上面的编码。看这里你需要检查操作系统相关设置(代码页,语言等)以上是C#学习教程:DoesProcess.StartInfo.ArgumentssupportUTF-8strings?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
