2

我一直在用 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 回答 1

2

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

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

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

  1. 不仅使用起来完全有意义wchar_t,而且是推荐的方式。
  2. 是的,有一个优势:您的程序可以处理 Windows 支持的所有字符。如果使用 char,则无法处理任何不在当前代码页中的字符。
  3. 它们没有被转换——它们保持原样,即 UTF-16 字符。

不幸的是,命令提示符本身是一个“ANSI”应用程序,因此它受到“ANSI”的所有限制,如果您从命令提示符使用它,这会影响您的应用程序。但是,控制台应用程序可以在没有命令提示符窗口的情况下以其他方式使用,然后它可以完全支持 Unicode。

于 2013-03-10T22:06:00.640 回答