【问题标题】:c doesn't print "┌──┐" character correctlyc 不能正确打印“┌──┐”字符
【发布时间】:2015-11-24 21:23:02
【问题描述】:

下午好,我的 c 代码遇到问题,我不知道是什么原因造成的。

每次我尝试打印这样的字符时:“┌──┐”我的程序只会打印一些奇怪的字符,就像这个屏幕截图一样:

我在 Windows 上使用 Qt Creator,Qt 版本为 5.5.0 MSVC 64 位。编译器是 Microsoft Visual C++ Compiler 12.0 (amd64)。

我尝试更改语言环境,但没有成功。我发现打印这些字符的唯一方法是使用 ASCII 代码将它们定义为 int 变量并打印它们,但这会导致一些非常广泛且丑陋的编码,如下所示:

int cSupEsq = 218;  //'┌'
int cSupDir = 191;  //'┐'
int cInfEsq = 192;  //'└'
int cInfDir = 217;  //'┘'
int mVert = 179;    //'│'
int mHor = 196;     //'─'
int espaco = 255;   //' '
int letraO = 111;   //'o'

//Inicia limpando a tela da aplicação
clrscr();

//Linha 1
printf("%c", cSupEsq);
for (i = 1; i < 79; i++) { printf("%c", mHor); }
printf("%c", cSupDir);

有什么方法可以让程序正确处理这些字符?什么可能导致此问题?

【问题讨论】:

  • 您正在尝试在 unicode 环境中打印 8 位 ascii 字符。不会工作...
  • 改用QString
  • 抱歉,您能澄清一下吗?我需要改变环境吗?
  • 我必须在这个项目上使用纯 C,我正在使用 Qt Creator 来实现 IDE 的附加功能。
  • 您的“丑陋的解决方法”实际上是一个更好的方法。将其包装在一个函数中。

标签: c windows qt-creator


【解决方案1】:

您使用 OEM 代码点的解决方案是正确的方法,代码页 850/437 是控制台的默认代码页,因此应该可以工作。您还可以使用SetConsoleOutputCP 来确保控制台使用正确的代码页。

话虽如此,当您不使用解决方法时会发生什么是源文件正在使用不同的代码页保存,即。不是代码页 850/437。源代码的内存表示是 Unicode(可能是 UTF-8),当您保存文件时,字符的内存表示会映射到文件的目标代码页。

您可以做的是使用 850/437 代码页作为目标保存文件,我不知道您如何在 Qt Creator 中执行此操作(如果可以的话),例如在 Visual Studio 中您可以选择保存按钮上的向下箭头并选择“使用编码保存”,然后您可以继续选择目标代码页,在您的情况下为代码页 850。这将确保内存中的代码点正确映射到要编译的文件.

我希望这有助于解释这个问题。

【讨论】:

  • 代码页 437 不包含 Ô,它更有可能是代码页 850。您认为源代码是 UTF-8 的假设很可能,或者编译器正在翻译它。
  • @MarkRansom,你说得对,我忘记了 850。谢谢,我会更新回复。
  • 你第一次是对的,代码页 437 我们许多人的默认值。只是不是每个人。
  • 应该可以使用转义字符,不是吗?那不是更可靠吗?
【解决方案2】:

不必一次打印一个字符。相反,您可以使用转义序列:

printf("\xDA\xBF\xC0\xD9\xB3\xC4\xFF");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2012-09-13
    • 2019-05-17
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多