【问题标题】:C Cyrillic console input with standard char data type instead of wchar_t具有标准 char 数据类型而不是 wchar_t 的 C Cyrillic 控制台输入
【发布时间】:2017-10-25 04:20:24
【问题描述】:

在我的大学里,我有一个课程要编写一个 C 项目,该项目支持控制台上的西里尔字母输入和文本以及写入文件。但它们只允许使用 char 数据类型和 printf scanf 函数。

在过去的两天里,我一直在研究如何做到这一点,并找到了解决方案,如果您将编码设置为 UTF16 并仅使用 wchar_t 则支持西里尔字符。但这让我使用 wchar_t 函数 wprintf、wscanf 等。这不是一个真正的选择。

这是我现在拥有的代码,但它在控制台上打印出奇怪的符号。

int main(void) {

setlocale(LC_ALL, "bg-BG");

char str[80];

printf("Въведи текст: "); //Enter text:
scanf("%s", str);

printf("Ти въведе: %s", str); //You entered: 

getch();

return 0;

}

我有什么遗漏或误解吗?据我所知,C/C++ ASCII 表仅支持 0 - 127 范围内的英文字符。

【问题讨论】:

  • 有 8 位编码,如 win1251、KOI-8 等,其代码中的西里尔字符集 > 127。但这实际上取决于控制台支持的字符集。
  • 对我来说,显而易见的解决方案似乎是将编码设置为 UTF-8。然后,您应该能够通过标准的基于char 的函数读取和写入Unicode 文本,但请注意,所有非ASCII Unicode 字符将被表示为两个或多个连续的char 对象。如果您不小心,可能会以各种方式绊倒您。
  • 为什么 wchar_t 函数“不是一个真正的选择”?
  • 所以这是可能的。但是如何将其设置为 UTF8?我知道的唯一方法是使用这个: _setmode(_fileno(stdout), _O_U8TEXT);但这让我使用 wchar_t @Toby 这不是一个选项,因为我的大学老师说必须只使用我们在这种情况下使用的函数是基于字符的函数
  • 更新:尝试使用 setlocale(LC_ALL, "UTF-8"); 并且它可以工作,但现在我使用 printf() 编写的控制台输出出现了奇怪的符号。输入没问题..

标签: c encoding cyrillic


【解决方案1】:

显然,幸运的是,我设法使用这两个使其工作:

system("chcp 1251"); setlocale(LC_ALL, "UTF8"); 所以这是最终的解决方案:

int main(void) {

    system("chcp 1251");
    setlocale(LC_ALL, "UTF8");

    char str[80];

    printf("Въведи текст: ");
    scanf("%s", str);

    printf("Ти въведе: %s", str);

    getch();

    return 0;
}

现在像魅力一样工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多