作为Basile points out,版权符号 (©) 不是 ASCII 字符。也就是说,它不是 7 位 ASCII 字符集中包含的字符之一。
您需要切换到 Unicode 编码才能使用此类超出 7 位 ASCII 范围的“特殊”字符。这在 Windows 中并不难,它只要求您使用宽字符 (wchar_t) 而不是窄字符 (char)。与大多数使用 UTF-8(使用常规 char 数据类型)实现 Unicode 支持的基于 Unix 的系统不同,Windows 没有对 UTF-8 的内置支持。它使用 UTF-16 代替,这要求您使用较大的 wchar_t 类型。
方便的是,C++ 标准库也支持宽字符串,您只需要使用相应版本的类即可。您想要的那些将在他们的名字前面附加一个w。因此,在 Windows 上重写代码以使用宽 (Unicode) 字符,它看起来像这样:
#include <iostream> // (standard C++ headers should be in angle brackets)
int main(int argc, char * argv[])
{
std::wcout << (wchar_t)0xA9 << " Copyright symbol" << std::endl;
return 0;
}
当您在 Windows 上尝试原始代码时得到那个奇怪的 ⌐ 字符的原因是该字符是 0xA9 在默认 Windows 字符集中映射到的值。你看,char 类型支持 8 位值,但我上面说过 ASCII 字符集只定义了 7 位值的字符。这个额外的位在 Windows 上用于定义一些额外的有用字符。
有两种不同的扩展窄(非 Unicode)字符集,一种称为 OEM 字符集,另一种(由于历史原因)称为 ANSI 字符集。通常,命令提示符使用OEM character set,它用字符填充大部分上限,用于在基于文本的环境中绘制线条、框和其他模拟图形。传统的非 Unicode Windows 应用程序通常使用 ANSI 字符集,该字符集特定于您的本地化版本的 Windows,并用显示您的语言中的所有字母/符号所需的字符填充上限。
如果这听起来很复杂,那是因为它是。这就是为什么每个人都忘记了所有这些东西并在 Windows 上只使用 Unicode。我也强烈向您推荐这条路。 :-)
编辑:坚果,我忘了它比这更复杂。将代码更改为输出宽字符可能还不够。 Windows 命令提示符在各种方面都broken向后兼容,严重阻碍了它对 Unicode 字符的支持。
默认情况下,它使用可能甚至不为大多数 Unicode 字符提供符号的光栅字体(版权符号可能很常见,足以成为一个例外)。您需要将命令提示符使用的字体更改为 Lucida Console 或 Consolas 等其他字体,以确保其正常工作。幸运的是,您可以为所有命令提示符窗口设置默认值。不幸的是,这是针对每个用户的设置。
此外,命令提示符仍然使用活动代码页,因此我在上面解释的所有内容仍然相关,您不能忘记它。您可以使用chcp xxxx 命令更改它使用的特定代码页,其中xxxx 是您希望使用的代码页的编号。不幸的是,这仅适用于当前控制台会话,并且每次都必须重置。对于需要输出 Unicode 字符的应用程序来说,这不是一个好的解决方案。
有关这些问题以及如何在命令提示符上输出 Unicode 字符串的更多信息,请参阅这些问题的答案: