在 Visual Studio 2010 中打印版权符号
Posted
技术标签:
【中文标题】在 Visual Studio 2010 中打印版权符号【英文标题】:Printing Copyright Symbol in Visual Studio 2010 【发布时间】:2013-03-22 06:25:38 【问题描述】:我一直在努力使用 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;
Linux/HP-UX 和 AIX 上的输出:© Copyright symbol
Windows 上的输出:⌐ Copyright symbol
我是 Windows 新手,谁能帮帮我。
【问题讨论】:
查看***.com/questions/2492077/… char CopyrightChar = '\xa9'; cout utf8everwhere.org 相关 【参考方案1】:作为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 字符串的更多信息,请参阅这些问题的答案:
What encoding/code page is cmd.exe using? Can command prompt display unicode characters?【讨论】:
@Aniket 是的,从原始代码中复制了它。我刚刚修好了。 @CodyGray 非常感谢您的解释。我仍然无法看到您建议的更改的版权符号。我在设置下尝试了“使用 Unicode 字符集”和“多字节字符集”。还使用了可以打印版权符号的字体:( 非常感谢@CodyGray,感谢您的宝贵时间和帮助!【参考方案2】:注意0xa9
不是ASCII(它有7 位字符,限制在0 - 0x7f
范围内)。可能是ISO/IEC 8859-1。许多当前的系统(包括今天的大多数 Linux 终端)现在都使用 UTF-8,其中版权字形由两个字节编码,因此您可以在 C 或 C++ 源代码中编码 "\302\251"
或 "\xc2\xa9"
。所以你的程序不会在我使用 UTF-8 的 Linux xfce4-terminal
中显示版权标志。
一些 Windows 机器有不同的编码系统。
如果可能,我会将您的系统(无论是 Linux 还是 Windows)设置为在其终端上使用 UTF8 character encoding(或使用 UTF16 宽字符)。阅读UTF-8 everywhere。
ASCII 传统的版权调用非常普遍 (C)
正是因为 ASCII 编码没有任何版权字形。
【讨论】:
内置的 Windows 命令提示符不支持 UTF-8。但是,它确实支持 Unicode,但实现是 UTF-16,并且需要您使用宽字符。 @Alexey 如果我没记错的话,那是一个伪代码页,使用时会出现各种兼容性问题。也许这是我不知道的命令提示符特有的东西。当然,没有办法让操作系统本身或非 Unicode 程序使用 UTF-8 代码页。 看起来你是对的,我有点搞混了。 UTF-8 (65001) is supported as an NT code page,你只是 can't set the system to use it as an ANSI code page(这就是非 Unicode 应用程序无法使用它的原因)。你知道的越多,事情就越复杂。【参考方案3】:取自here:
#if defined(WIN32)
#include <windows.h>
#endif
#include <stdio.h>
void print_copyright_hint()
printf("Copyright ");
#if defined(WIN32)
auto copyright = const_cast<wchar_t *>(L"©");
auto handle = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsoleW(handle, copyright, static_cast<DWORD>(wcslen(copyright)), nullptr, nullptr);
#else
printf("©");
#endif
printf(" my Company");
【讨论】:
【参考方案4】:您可以使用 alt+0169。 如果我错了,请原谅我。
【讨论】:
不,这确实提供了问题的答案。以上是关于在 Visual Studio 2010 中打印版权符号的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2010 速成版的 Javascript 插件
谁有microsoft visual studio 2010 旗舰版的产品密钥 急需!
Microsoft Visual Studio 2010旗舰版怎么破解