windows - 在 Windows C++ 控制台应用程序中使用 wchar_t/wmain 有意义吗?

标签 windows unicode console codepages widechar

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

默认情况下,Windows 控制台根据区域设置使用 OEM 代码页(例如,在我的计算机上为 CP437/DOS.Western)。我想,如果是 Windows 西里尔文版本,那就是 CP866,等等。这些 OEM 代码页仅包含 256 个字符)

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

  1. 在这种情况下,在我的应用程序中使用 wmain/wchar_t 和宽字符类型是否有意义?
  2. 使用宽类型有什么优势吗?或者说如果只使用char *会有什么严重的问题吗?
  3. 当使用宽字符类型时,命令行参数和环境字符串的编码是什么 - (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) 字符的映射由键盘布局定义。这完全独立于代码页。例如,您可以在使用西里尔字母代码页的系统上使用中文键盘布局。

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

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

关于windows - 在 Windows C++ 控制台应用程序中使用 wchar_t/wmain 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183542/

相关文章:

java - 表示 Windows 下以 `Path` 开头但没有磁盘驱动器的 `\`

windows - 计划任务 Linux 与 Windows

java - 缺少标识符,即使它在上面定义了一行?

python - 奇怪的 unicode 问题

sql-server - 如何让sequelize在其SQL语句中的Unicode字符串前加N?

c - wxWidgets:客户端连接到服务器,但服务器无法识别

java - 生成将在 Windows 上运行的可移植 .exe 文件(从 .jar)

java - Eclipse Juno 中没有控制台输出

internet-explorer - 我们可以将开发人员工具中的 IE 控制台保存到文件中吗?

css - 如何让 NGINX 提供 .js、.css、.html 等静态内容?