c++ - 流出扩展 ASCII

标签 c++ char streaming extended-ascii wchar

我知道只有正字符 ASCII 值才能保证跨平台支持。

在 Visual Studio 2015 中,我可以:

cout << '\xBA';

它打印:

当我在 http://ideone.com 上尝试时,我没有打印任何东西。

如果我尝试使用文字字符直接打印:

cout << '║';

Visual Studio 发出警告:

warning C4566: character represented by universal-character-name '\u2551' cannot be represented in the current code page (1252)

然后打印:

?

当在 http://ideone.com 上运行此命令时,我得到:

14849425

我读到 wchar 可能为此提供跨平台方法。真的吗?或者我只是在扩展 ASCII 上运气不好?

最佳答案

这里有两个不同的概念。

第一个是区域设置之一,在 Microsoft-ese 中通常称为“代码页”。语言环境定义了哪些视觉字符由哪个字节序列表示。在您的第一个示例中,无论您的程序以何种语言环境执行,它都会显示“║”字符,以响应字节 0xBA。

其他语言环境或代码页将针对相同的字节显示不同的字符。许多语言环境是多字节语言环境,其中可能需要几个字节才能显示单个字符。例如,在 UTF-8 语言环境中,同一字符 ║ 需要三个字节才能显示:0xE2 0x95 0x91。

这里的第二个概念是源代码字符集之一,它来自编译源代码之前编辑的语言环境。当您在源代码中输入 ║ 字符时,我想它可能会被表示为 0xBA 字符,或者可能是 0xE2 0x95 0x91 序列,如果您的编辑器使用 UTF-8 语言环境。编译器在读取源代码时,只会看到实际的字节序列。一切都减少到字节。

幸运的是,所有的 C++ 关键字都使用 US-ASCII,因此使用什么字符集编写 C++ 代码并不重要。直到你开始使用非拉丁字符。这会导致编译器发出警告,基本上是通知您,您使用的东西可能有效,也可能无效,具体取决于生成的程序运行的最终语言环境。

关于c++ - 流出扩展 ASCII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35747864/

相关文章:

c++ - cp1251 : encoding distortion when converting from char* to wchar_t*

iphone - iPhone HTTP 流的 AES 128 加密

c++ - 以下代码在并发情况下的可能结果是什么?

c++ - 将字符串拆分为字符,然后返回字符串

c++ - 收集指针和添加对象

java - Id.CharAt() 的整数版本

javascript - 从nodejs流中获取video.mp4视频标签

java - 如何使用 Java 流式传输 HTTP 请求的主体

C++ 大小感知数据类型/参数

c++ - Vim,帮助 YCM 为 c++ 工作