我正在尝试使用fgets()
函数从stdin
中读取一个UTF-8字符串。在此之前,已将控制台输入模式设置为CP_UTF8
。 我还将PowerShell的控制台字体设置为Lucida Console。 最后,我通过使用printf()
将德语字母Ä
(UTF-8编码:0xC3,0x84)打印到控制台来验证UTF-8输出是否正常工作。这个操作是正确的,但是fgets()
似乎无法从控制台读取UTF-8。下面是一个小型测试程序:
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[])
{
unsigned char s[64];
memset(s, 0, 64);
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
printf("UTF-8 Test: %c%c\n", 0xc3, 0x84); // print Ä
fgets(s, 64, stdin);
printf("Result: %d %d\n", s[0], s[1]);
return 0;
}
运行此程序并输入“Ä”,然后按下ENTER键,它只会打印以下内容:
Result: 0 0
即,
s
中没有写入任何内容。然而,当我输入"A"时,我得到了以下正确的结果:Result: 65 10
请问如何在Windows上使fgets()
函数支持UTF-8字符?
编辑
根据Barmak的解释,我已经更新了我的代码,使用了wchar_t
函数代替ANSI函数。然而,它仍然不起作用。以下是我的代码:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <windows.h>
int main(int argc, char *argv[])
{
wchar_t s[64];
memset(s, 0, 64 * sizeof(wchar_t));
_setmode(_fileno(stdin), _O_U16TEXT);
fgetws(s, 64, stdin);
wprintf(L"Result: %d\n", s[0]);
return 0;
}
当输入
A
时,程序打印出的结果是 Result: 3393
,但我预期的结果应该是 65
。当输入 Ä
时,程序打印出的结果是 Result: 0
,但我预期的结果应该是 196
。这是怎么回事?为什么现在甚至对 ASCII 字符也不起作用了?我的旧程序只使用 fgets()
,对于像 A
这样的 ASCII 字符工作正常,只有对于非 ASCII 字符(如 Ä
)失败了。但新版本甚至对 ASCII 字符也不起作用,或者说 3393
是 A
的正确结果吗?我很困惑,请帮忙!