【问题标题】:C++ Printing special ascii characters to the Windows consoleC++ 将特殊 ascii 字符打印到 Windows 控制台
【发布时间】:2015-06-26 23:27:04
【问题描述】:

经过 2 个小时的搜索和尝试各种方法后,我正在努力将特殊的 ascii 字符打印到控制台! (C++)

typedef unsigned char UCHAR;

int main()
{
  UCHAR c = '¥';
  cout << c;

  return 0;
}

为什么这段代码打印的是 Ñ (209) 而不是 ¥ (165)???

我试过了:

SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);

但无论我将哪些值传递给它,它们似乎都没有做任何事情。

有人建议需要通过注册表更改控制台的字体。但这很荒谬。我不希望我的最终用户为了运行我的程序而不得不开始更改注册表值...

真正奇怪的是,如果我将所有 ascii 字符打印到文件中(使用 ofstream),它们会在记事本和 Visual Studio 编辑器(2012 专业版)中正确显示。

ofstream file("ASCII.txt");;
if (file.is_open())
{
    UCHAR c = 0;
    for (int i = 0; i < 256; i++)
    {
        c++;
        file << c << "\t|\t" << (int)c << endl;
    }
}
file.close();

非常感谢任何帮助。 谢谢!

【问题讨论】:

  • 我敢打赌type 命令和你的程序一样。打开命令行窗口并发出 type ASCII.txt 并查看输出到控制台的内容。
  • 在互联网上搜索“Microsoft 代码页”。
  • 字符 165 在 UTF-8 中是非法的。最高位已设置,这意味着它是一个包含 2 个以上字节的连续字符。
  • @PaulMcKenzie 我不熟悉 type 命令,粗略的谷歌搜索只返回了预期的“typeof”和“typedef”函数的结果。我觉得你可能误读了我的问题。底部的代码部分仅用于测试实际的 ascii 值。我不打算在我的最终程序中使用它。
  • @BenSeawalker 他的意思是 DOS type 命令。

标签: c++ console-application extended-ascii


【解决方案1】:

欢迎来到编码的痛苦:(

#include <iostream>
#include <windows>

int main() {
    SetConsoleCP(437);
    SetConsoleOutputCP(437);
    std::cout << (char)157 << "\n";
}

生成:

问题在于您的源文件在 CP437 中 不是,因此该字符的值与您尝试打印的值不同(如您所述,源值是 165,即是 CP437 中的不同角色)。

https://en.wikipedia.org/wiki/Code_page_437

【讨论】:

  • SetConsoleCP(437); SetConsoleOutputCP(437); cout &lt;&lt; '¥'; 仍然打印 'Ñ' :(
  • 哦,谢谢您的帮助。你能发布一个链接到你得到你的ascii代码的网站吗?我见过的所有的人都说 char 是“190”而不是“157”
  • 答案在最后。如果我使用 CP 437 编码保存文件,cout &lt;&lt; '¥'; 对我有用。
  • 我用 437 编码保存了我所有的 .cpp 和 .h 文件,并清理/重建了项目。仍然没有效果。 :(
  • 没关系。我重新启动了VS,现在一切正常!谢谢@kfsone,我从没想过要更改源文件的编码。哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多