设置语言环境后,scanf-printf调用非ASCII字符

我想知道为什么非ASCII本地input输出失败:

setlocale(LC_ALL,""); scanf("%s",buffer); // I type "příšerně" printf("%s",buffer); // I get "pýˇçernŘ" 

locale是Czech_Czech Republic.1250 ,所有非ASCII字符(říšě)都在CP1250中。 为什么失败? 参考文献说

在<cstdio>(<stdio.h>)中,格式化的input/输出操作受字符转换规则的影响。

使用默认的“C”语言环境可以提供正确的输出。 如何解决它?Windows上,我不能在setlocale中使用UTF-8

如果提供UTF-7或UTF-8的代码页值,则setlocale将失败,返回NULL。

在我的项目中,我使用setlocale来读取UTF8文本文件,并使用WinAPI MultiByteToWideChar函数在控制台上显示它,但这需要系统默认的语言环境,所以我需要设置语言环境。

编辑 :我刚刚发现input在CP852 ,这是默认在“C”。 我想我可以使用iconv ,但我宁愿说服scanf不要留在CP852。

经过3个小时的测试,我最终得到了工作解决方案。 它可能不适用于每个人,因为它背后还有一点神秘感。 所以这有助于:

 setlocale(LC_CTYPE,"Czech_Czech Republic.852"); 

自DOS时代以来,CP852是中欧的默认控制台代码页。 还有chcp DOS命令和SetConsoleCP以及SetconsoleOutputCP winAPI函数。 出于某种原因,这仍然混乱输出:

 setlocale(LC_CTYPE,"Czech_Czech Republic.1250"); SetConsoleCP(1250); SetConsoleOutputCP(1250); 

…但这是好的

 setlocale(LC_CTYPE,"Czech_Czech Republic.852"); SetConsoleCP(852); // default in CE win console SetConsoleOutputCP(852); // default in CE win console 

请注意,UTF-8无法在setlocale设置,请参阅原始问题。