我想知道为什么非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
设置,请参阅原始问题。