我有一个启动进程的.Net应用程序,通过Process.StartInfo.Arguments传递一个长参数列表。新进程只能处理传递给main()函数的参数中的8位字符。因此,我在Process.StartInfo.Arguments中编码了字符串,以便每个字符都是一个8位值。
问题是,新进程看不到我使用的相同8位值。对于小于128的值,该值将通过unmolested传递。其他值以某种方式发生了变化,事实上,新流程看到的参数列表通常比我传入的更长。
在将参数传递给新进程时,使用什么编码来转换参数?我可以修改那个编码吗?
我看到与进程标准输出和标准错误相关的编码;我认为那些是无关紧要的。
答案 0 :(得分:1)
这不是您可以在.NET代码中修复的内容。 .NET Process类以及Windows使用Unicode。从Unicode到8位字符串的转换发生在您启动的程序中嵌入的C运行时库中。该转换基于当前系统代码页,它使用WideCharToMultiByte()API函数和CodePage = CP_ACP。除了更改系统代码页之外,无法更改转换。这对整个操作系统产生了巨大影响。
当然这是一个有损转换,它只能处理代码页中定义的字符。如果您传递一个包含无法在代码页中表示的Unicode字符的参数,那么程序将在该字符串中看到一个问号。您可以在.NET代码中执行的任何数量的字符串操作都可以防止这种情况,而不是省略或替换该字符。但是你不再把它传给同一个字符串了。