【问题标题】:Makes sense to use wchar_t/wmain in a windows c++ console application?在 Windows C++ 控制台应用程序中使用 wchar_t/wmain 有意义吗?
【发布时间】:2013-02-17 11:27:52
【问题描述】:

我一直在用 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 的,还是原封不动?

感谢您的贡献。

【问题讨论】:

    标签: windows unicode console codepages widechar


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • @oofe,感谢您的回复。但是,目前尚不清楚。 1. Windows 命令提示符有一个默认代码页。可以通过运行 chcp 命令检索当前活动的代码页;并且,可以使用相同的命令进行更改。根据您的评论,它与当前使用的键盘布局无关。那么,这有什么意义呢?不确定交叉场景中的行为是什么:中文 kb 布局和西里尔代码页。
    • 2.对于启用 unicode 的应用程序,当从带有参数的命令提示符调用时,命令行参数由 Windows CRT 转换为 UTF-16 并作为 wchar_t *argv[] 传递给 wmain()。那正确吗?这就是我在上面的问题 3 中的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多