在Visual Studio 2010中打印版权符号

aru*_*_vj 4 c c++ windows ascii visual-studio

我一直在努力使用Visual Studio在Windows中打印版权符号.我知道0xA9是版权符号的ASCII代码,它适用于非Windows平台.但在Windows上,我无法使用相同的代码打印版权符号.

#include "iostream.h"
using namespace std;


int main(int argc, char * argv[])
{

        cout << (char)0xA9 << " Copyright symbol" << endl;

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

Linux/HP-UX和AIX上的输出: © Copyright symbol

Windows上的输出: ? Copyright symbol

我是Windows的新手,有人可以帮助我.

Cod*_*ray 5

正如Basile指出的那样,版权符号(©)不是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;
}
Run Code Online (Sandbox Code Playgroud)

?当您在Windows上尝试原始代码时,您获得该奇怪字符的原因是该字符是值0xA9在您的默认Windows字符集中映射到的字符.你看,该char类型支持8位值,但我在上面说过,ASCII字符集只定义了7位字符.在Windows上使用该额外位来定义一些其他有用的字符.

有两组不同的扩展窄(非Unicode)字符集,一组称为OEM字符集,另一组称为(由于历史原因)称为ANSI字符集.通常,命令提示符使用OEM字符集,该字符集填充了大部分上限范围,并在基于文本的环境中绘制线条,框和其他模拟图形的字符.传统的非Unicode Windows应用程序通常使用ANSI字符集,该字符集特定于Windows的本地化版本,并使用显示您所用语言中所有字母/符号所需的字符填充较高范围.

如果它听起来很复杂,那是因为它是.这就是为什么每个人都忘记了所有这些东西,并在Windows上使用Unicode.我强烈建议你走这条路.:-)

编辑:坚果,我忘了它比这更复杂.将代码更改为输出宽字符可能还不够.Windows命令提示符是打破在各种方式的向后兼容,严重蹒跚其支持Unicode字符.

默认情况下,它使用光栅字体,甚至可能不提供大多数Unicode字符的符号(版权符号很可能是常见的例外).您需要将命令提示符使用的字体更改为Lucida Console或Consolas等其他字体,以确保其正常工作.幸运的是,您可以为所有命令提示符窗口设置默认值.不幸的是,这是一个按用户设置.

此外,命令提示符仍然使用活动代码页,所以我上面解释的所有内容仍然相关,你不能忘记它.您可以使用chcp xxxx命令更改它使用的特定代码页,其中xxxx是您要使用的代码页的编号.不幸的是,这仅适用于当前的控制台会话,每次都必须重置.对于需要输出Unicode字符的应用程序来说,这不是一个好的解决方案.

有关这些问题以及如何在命令提示符上输出Unicode字符串的更多信息,请参阅以下问题的答案: