【问题标题】:Encoding of command line arguments C#命令行参数的编码 C#
【发布时间】:2020-04-11 19:45:50
【问题描述】:


我在 WPF 应用程序中有一个字符串,我使用 Process.StartInfo.Arguments 属性将其作为命令行参数传递给本机应用程序。我知道 C# 以 UTF-16 编码存储字符串。而且我知道本机应用程序对编码没有任何作用,并希望它是默认的,在我的国家是 windows-1251。所以我们在 C# 应用程序中有 UTF-16,在本机应用程序中有 1251。这实际上以某种方式起作用。


问题是转换发生在哪里以及它的可靠性如何。有没有办法强制 Process 类对命令行参数使用特定的编码?

【问题讨论】:

  • Process Proc = new Process(); Proc.StartInfo.StandardOutputEncoding = Encoding.UTF8;
  • @Clint 你确定这对进程参数有影响吗?
  • 哎呀,它错误的上下文参数在 UTF-16 中接收,我认为 .NET 字符串也是如此

标签: c# encoding character-encoding command-line-arguments


【解决方案1】:

在 Unicode 操作系统(即任何现代版本的 Windows)上,Process.Start 方法调用 Win32 CreateProcessW 函数,该函数也使用 UTF-16 表示命令行参数。

字符转换(如果需要)由操作系统在启动进程时执行。如果本机应用程序的入口点接受 Unicode 命令行,则不需要转换,否则操作系统会将其转换为 ANSI 字符串。我不相信你作为调用者有能力控制这里使用哪个代码页。

【讨论】:

  • 那么 CreateProcessW 调用将看到本机应用程序的入口点接受 char* 并使用操作系统的默认代码页将 UTF-16 字符串转换为 ANSI 字符串?如何控制正在使用的代码页?
  • 这个问题的答案将暗示新进程的代码页继承了父进程中当前线程的语言环境:stackoverflow.com/questions/421409/… - 因此您可以通过更改 Thread. CurrentThread.CurrentCulture 或 Thread.CurrentThread.CurrentUICulture 在你开始进程之前(但我没有测试过这个)。如果没有,那么我认为您无法更改代码页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2016-12-22
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多