我一直在用 C++ 编写一个新的命令行应用程序。当然,我们支持的平台之一是 Windows。
默认情况下,Windows 控制台根据区域设置使用 OEM 代码页(例如,在我的计算机上为 CP437/DOS.Western)。我想,如果是 Windows 西里尔文版本,那就是 CP866,等等。这些 OEM 代码页仅包含 256 个字符)
我认为这意味着Windows控制台根据默认代码页将输入的击键转换为字符。 (并且,根据当前选择的字体,如果有相应的字形,则会显示)。
- 在这种情况下,在我的应用程序中使用 wmain/wchar_t 和宽字符类型是否有意义?
- 使用宽类型有什么优势吗?或者说如果只使用char *会有什么严重的问题吗?
- 当使用宽字符类型时,命令行参数和环境字符串的编码是什么 - (wchar_t * argv[] 和 wchar_t * envp[]),我的意思是。它们是通过 Windows CRT 转换为 UTF-16 还是保持不变?
感谢您的贡献。
最佳答案
您似乎假设 Windows 在内部以指定的代码页运行。这不是真的。 Windows 内部以 Unicode (UTF-16) 工作。对于使用 char
而不是 wchar_t
的旧版软件,输入和输出将转换为指定的代码页。
I think what this means is the Windows console translates the input key strokes into characters based on the default code page
这是不正确的。键击到 (Unicode) 字符的映射由键盘布局定义。这完全独立于代码页。例如,您可以在使用西里尔字母代码页的系统上使用中文键盘布局。
- 使用
wchar_t
不仅完全有意义,而且是推荐的方式。 - 是的,有一个优点:你的程序可以处理Windows支持的所有字符。如果使用 char,则无法处理当前代码页之外的任何字符。
- 它们不会被转换 - 它们保持原样,即 UTF-16 字符。
不幸的是,命令提示符本身是一个“ANSI”应用程序,因此它受到“ANSI”的所有限制,如果您从命令提示符使用它,这会影响您的应用程序。但是,控制台应用程序可以以其他方式使用,无需命令提示符窗口,然后它就可以完全支持 Unicode。
关于windows - 在 Windows C++ 控制台应用程序中使用 wchar_t/wmain 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183542/