【问题标题】:Print extended ASCII char in C, Linux在 C、Linux 中打印扩展的 ASCII 字符
【发布时间】:2019-01-03 11:52:37
【问题描述】:

我正在尝试打印所有扩展的 ASCII 字符。我在论坛上找到了一个代码:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <iostream>

int main(void) {
    wchar_t c;
    setlocale(LC_ALL, "C");

    for (c = 128; c < 256; c++) {
        wprintf(L"char nr %d: %lc\n", c, c);
    }
    printf("\n%s\n", setlocale(0, NULL));

    std::cin.get();
    std::cin.get();
return 0;
}

此代码在 VS 2017 的 Windows 中运行。

在屏幕截图中,您可以看到此代码在 windows 和 Linux 中的结果。我知道问题出在编码上,但我不知道如何解决。

【问题讨论】:

  • 考虑gnome-terminal的设置?
  • linux中$LANG环境变量的值是多少?
  • 这个程序是C++,不是C。代码没问题,问题出在你的终端/用于显示的程序上(使用宽字符时它不支持扩展ascii)。 Windows 使用支持扩展 ascii 的编码,wprintf
  • LANG = pl_PL.UTF-8,终端字符编码为UNICODE-utf8。
  • @KamilCuk 我该如何解决?

标签: c linux codepages


【解决方案1】:

好的,一切都很好。 ASCII 字符限制在 128 个以下。以上内容取决于实际字符集。

在 Linux 中,您显示的是 ISO-8859-1(又名 Latin1)字符集的子集,而在 Windows 上,您显示的是 Windows 代码页 850。当您在 Linux 上声明 UTF8 字符集时,您应该只显示错误字符,但您的终端似乎将某些字节解释为 latin1。

如果要显示所有 Latin1 字符,只需更改 LANG 环境变量:

export LANG=pl_PL.ISO-8859-1

或者由于您的语言似乎是波兰语,因此 ISO-8859-2 可能更合适:

export LANG=pl_PL.ISO-8859-2

【讨论】:

  • @magnus250:运行sudo localedef -f ISO-8859-2 pl_PL pl_PL.ISO-8859-2 定义波兰语 ISO-8859-2 语言环境,然后重试。它会起作用的。除了 Microsoft 之外的所有人基本上都迁移到了 UTF-8 语言环境,这就是为什么 ISO-8859-2 变体默认没有安装在你的 Linux 机器上的原因,你需要自己安装它来复制 Windows 的行为。
  • @NominalAnimal 我这样做。当我将语言环境放入控制台时,我得到 LANG=pl_PL.ISO-8859-2,但此代码仍然无法正常工作:(。
  • 好的,我会按照你的建议去做。我使用 printf("%d - \%c\n, i,i) 打印所有扩展的 ascii 并且它有效。谢谢你:)
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多