Windows命令行参数编码是什么?

5
Windows在cmd.exe窗口中启动的程序所使用的命令行参数编码是什么?
命令行参数的编码似乎不受使用“chcp”设置的控制台代码页的影响(我将其设置为UTF-8,代码页65001,并使用Lucida Console字体。)
如果我从一个UTF-8文件中复制并粘贴一个十六进制编码为E28093的EN DASH到命令行中,它将在cmd.exe窗口中正确地显示。然而,当它被传递给程序时,它似乎被转换为十六进制96(一种ANSI表示)。如果我将Cyrillic字符粘贴到命令行中,它们也会正确显示,但在程序中会显示为问号(十六进制3F)。
如果我复制一个命令行并将其粘贴到文本文件中,生成的文件是UTF-8;它包含与源文件相同的EN DASH和Cyrillic字符的编码。
看起来,粘贴到cmd.exe窗口中的字符是使用使用“chcp”选择的代码页捕获和显示的,但在将它们作为参数传递给程序之前,某些ANSI代码页用于将字符转换为不同的编码。无法转换的字符显然会被静默转换为问号。
因此,如果我想在程序中正确处理命令行参数,我需要确切地知道参数的编码。例如,如果我想将命令行参数与从文件中读取的已知UTF-8数据进行比较,我需要将参数从正确的编码转换为UTF-8。谢谢。
1个回答

1
如果您的目标是比较Unicode字符,则应在程序中调用GetCommandLineW(或使用wmain以便argv使用wchar_t),然后将此UTF-16LE命令行字符串转换为UTF-8或反之亦然。 GetCommandLineA可能会使用CP_ACP将Unicode源字符串转换。

1
根据上下文,CommandLineToArgvW函数在这里也可能很有用。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接