我知道只有正字符 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/