【问题标题】:Why does setlocale give me ? instead of normal letters?为什么 setlocale 给我?而不是普通的字母?
【发布时间】:2019-04-19 16:57:48
【问题描述】:

编程语言:C

IDE:代码块

编译器:GNU GCC 编译器

操作系统:Windows 7

我的 cmd 默认为代码页 852,所以我决定使用 setlocale(),将其设置为代码页 437

setlocale(LC_ALL, "English_United States.437")

但这样做会使一些字母/符号显示为“?”反而。有什么办法解决这个问题?

【问题讨论】:

  • 也许您需要将文件保存为 UTF8 或切换到 Unicode TrueType 字体,如“Lucida Console”。您在终端中使用“光栅字体”吗?
  • @KeineLust “Lucida Console”和“Consolas”仍然给我“?”并且使用 for 循环打印字母/符号以递增 char 变量,每次递增都会打印出该变量。
  • for(int x=0; x
  • setlocale() 调整程序解释输入和编码输出的方式。它对其他程序或操作系统如何做同样的事情没有任何作用。如果两个程序(例如您的程序和您启动它的终端窗口)想要交换文本,那么他们需要就区域设置的相关方面达成一致。你不能只改变它的一方面并期望得到满意的结果。

标签: c locale codepages setlocale codepage-437


【解决方案1】:

注意ASCII表的非扩展字符从0到127,处理扩展字符使用wchar_t

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

int main(void)
{
    wchar_t c;

    setlocale(LC_ALL, "English_United States.437");
    for (c = 32; c < 256; c++) {
        wprintf(L"%lc\n", c);
    }
    return 0;
}

【讨论】:

  • 那只会让事情变得更糟。现在字符/符号被不正确的字符/符号替换。例如,希腊字母被替换为“a”、“á”、“a”、“ä”……其中一些只是显示为空白“”。
  • 是的,我有。它将语言环境设置为“Slovenian_Slovenia.1250”,这是我想用“English_United States.437”替换的语言环境。甚至那个有不正确的字母/符号。
【解决方案2】:

所以我找到了 2 个解决方案。

1。 您可以在控制面板下更改系统默认代码页,但需要重新启动计算机并且非常不切实际,但您可以使用光栅字体。

2。 使用“系统(”chcp 437“);”会将代码页设置为 437,但您需要使用“Lucida Console”之类的字体将字符/符号显示为光栅字体,如果您更改代码页,由于某种原因无法正确打印字符/符号。

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 2011-12-26
    • 2023-02-09
    • 2015-11-17
    • 2020-01-20
    • 1970-01-01
    • 2021-05-23
    • 2010-10-06
    • 2020-09-29
    相关资源
    最近更新 更多