我想知道为什么非ascii本地输入输出失败:

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

地点是捷克共和国。1250和所有非ascii字符(__)都在cp1250中。为什么会失败?The reference
在()中,格式化的输入/输出操作是
受字符转换规则影响。
使用默认的“c”语言环境可以提供正确的输出。怎么解决?在windows上,我不能在setlocale中使用utf-8
如果您提供的代码页值为utf-7或utf-8,setlocale将
失败,返回空值。
在我的项目中,我使用set locale读取utf8文本文件,并使用winapi multibytetowidechar函数在控制台上显示它,但这需要系统默认的语言环境,所以我需要设置语言环境。
编辑:我刚刚发现输入在CP852中,这是“c”中的默认值。我想我可以用iconv,但我宁愿说服scanf不要继续使用cp852。

最佳答案

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

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

CP852是自DOS时代以来中欧的默认控制台代码页。还有chcpdos命令和SetConsoleCPSetconsoleOutputCPwinapi函数。出于某种原因,这仍然会影响输出:
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

注意,不能在setlocale中设置utf-8,请参阅原始问题。

07-28 02:54
查看更多