Scanf和printf返回不同的Unicode字符。

4
我需要制作一个可以读写希腊字母的程序。由于希腊语不属于ASCII字符集,我将控制台区域设置为UTF-8。在这个多字节混乱的环境中,我设法让一些字符串正常工作,直到我需要用户输入的部分出现了问题。
因此,我只会发布有问题的部分。
while(1) {
    char inputc[50]; 
    memset(inputc,'\0',50);
    scanf("%s",inputc)
    printf("%s",inputc);
}

无论输入哪个希腊字符,它都会打印出与输入不同的内容。此外,如果我对每个元素执行 printf("%d",inputc[i]); 以获取int值(对于希腊字母为负数),则得到的值与从字面量中读取同一字符时不同。


我只能通过给你的问题点赞来帮助你...祝你好运。 - Jean-François Fabre
不要仅仅描述输入和输出,而是发布使用的确切输入和结果。还要发布执行“将控制台区域设置为utf8”的代码,并显示更改本身没有出错。 - chux - Reinstate Monica
抱歉,但不行。我添加了区域设置和其他内容。仍然无法在控制台打印任何内容,或者出现奇怪的字符。 - dac1n
我不明白你想让我发布什么。我做了一个新程序,它就是那些代码行,前面加上了SetConsoleOutputCP(CP_UTF8)。这就是整个主函数。 - dac1n
SetConsoleOutputCP(CP_UTF8) 的结果值是什么? 参考链接 - chux - Reinstate Monica
显示剩余7条评论
1个回答

2
使用的命令是SetConsoleOutputCP(CP_UTF8); 这只影响标准输出(stdout)。要设置标准输入(stdin),您还需要SetConsoleCP(CP_UTF8)。如果只设置一个而不是另一个,则输入和输出字符将自然不同。但请注意,在Windows控制台中设置为代码页65001 / CP_UTF8(或通常没有特殊支持的任何多字节代码页,即那些不是传统区域设置默认代码页)会发生严重错误。在此状态下,Windows不正确地报告字节计数,导致打印调用损坏和重复输出以及扫描调用挂起。这通常不是让Windows程序使用Unicode的可行方法。

我也尝试了SetConsoleCP和setlocale。如果我同时使用这两个consoleCP命令,我可以打印希腊文,但希腊输入会破碎。如果我删除它们,我可以输入希腊文,但在程序内部会破坏。我真的不知道还能做什么,我已经尝试了一切。在Ubuntu上,它真的可以正常工作,无需任何额外的命令。 - dac1n
1
嗯,是的,Windows控制台存在问题。它无法以任何符合POSIX标准的方式处理Unicode。如果你真的必须让Unicode IO在Windows控制台上显示正确,那么你除了检测是否在Windows上运行并与控制台通信,然后切换代码路径之外别无选择。对于Windows路径,可行的方法有(a)使用_setmode_O_UTF8_O_UTF16,然后在这些流上使用宽字符接口,否则会出现错误。或者(b)调用Win32 ReadConsoleW/WriteConsoleW API。 - bobince
非常感谢您的回答。我很惊讶地看到Ubuntu可以直接使用,可能比Windows命令提示符更适合编程。 - dac1n
StackOverflow上有大量关于如何在Windows控制台输入输出中使用Unicode的问题。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接