在Windows c ++控制台应用程序中使用wchar_t / wmain是否有意义?

时间:2013-03-03 07:43:12

标签: windows unicode console codepages widechar

我一直在用C ++编写一个新的命令行应用程序。我们支持的一个平台当然是Windows。

默认情况下,Windows控制台根据区域设置使用OEM代码页(例如,在我的机器上它是CP437 / DOS.Western)。我认为,如果它是Windows Cyrillic版本,它将是CP866,依此类推。这些OEM代码页只包含256个字符)

我认为这意味着Windows控制台会根据默认代码页将输入击键转换为字符。 (并且,根据当前选择的字体,如果有相应的字形,则会显示)。

  1. 在这种情况下,在我的应用程序中使用wmain / wchar_t和宽字符类型是否有意义?
  2. 使用宽类型有什么好处吗?或者如果只使用char *会有什么严重问题吗?
  3. 当使用宽字符类型时,命令行参数和环境字符串的编码是什么 - (wchar_t * argv []和wchar_t * envp []),我的意思是。它们是通过Windows CRT转换为UTF-16还是不受影响?
  4. 感谢您的贡献。

1 个答案:

答案 0 :(得分:2)

您似乎假设Windows内部在指定的代码页中工作。这不是真的。 Windows内部使用Unicode(UTF-16)。对于使用char而不是wchar_t的旧版软件,输入和输出会转换为指定的代码页。

  

我认为这意味着Windows控制台会根据默认代码页将输入击键转换为字符

这不正确。键击到(Unicode)字符的映射由键盘布局定义。这完全独立于代码页。例如,您可以在使用西里尔语代码页的系统上使用中文键盘布局。

  1. 使用wchar_t不仅非常有意义,而且推荐方式。
  2. 是的,有一个优点:您的程序可以处理Windows支持的所有字符。如果使用char,则无法处理当前代码页中不存在的任何字符。
  3. 他们没有被转换 - 他们保持原样,即UTF-16字符。
  4. 不幸的是,命令提示符本身是一个“ANSI”应用程序,因此它受到“ANSI”的所有限制的影响,如果您在命令提示符下使用它,这会影响您的应用程序。但是,可以在没有命令提示符窗口的情况下以其他方式使用控制台应用程序,然后它可以完全支持Unicode。