设置区域设置后,scanf printf调用会弄乱非ASCII字符
我想知道为什么非ASCII本地输入输出失败:设置区域设置后,scanf printf调用会弄乱非ASCII字符,c,windows,character-encoding,console-application,locale,C,Windows,Character Encoding,Console Application,Locale,我想知道为什么非ASCII本地输入输出失败: setlocale(LC_ALL,""); scanf("%s",buffer); // I type "příšerně" printf("%s",buffer); // I get "pýˇçernŘ" 区域设置为捷克共和国。1250,所有非ASCII字符(říšě)均为CP1250为什么失败?说 在()中,格式化的输入/输出操作是 受字符转换规则的影响 使用默认的“C”语言环境可以提供正确的输出如何修复?在Windows上,我无法在中使用UT
setlocale(LC_ALL,"");
scanf("%s",buffer); // I type "příšerně"
printf("%s",buffer); // I get "pýˇçernŘ"
区域设置为捷克共和国。1250,所有非ASCII字符(říšě)均为CP1250为什么失败?说
在()中,格式化的输入/输出操作是
受字符转换规则的影响
使用默认的“C”语言环境可以提供正确的输出如何修复?在Windows上,我无法在中使用UTF-8
如果提供UTF-7或UTF-8的代码页值,则setlocale将
失败,返回NULL
在我的项目中,我使用setlocale读取UTF8文本文件,并使用WinAPI MultiByteToWideChar函数在控制台上显示它,但这需要系统默认的区域设置,所以我需要设置区域设置
编辑:我刚刚发现输入在中,这是“C”中的默认值。我想我可以使用,但我宁愿说服scanf不要继续使用CP852。经过3个小时的测试,我最终得到了有效的解决方案。它可能不适用于所有人,因为它背后仍然有一点神秘。因此,这有助于:
setlocale(LC_CTYPE,"Czech_Czech Republic.852");
CP852是自DOS时代以来中欧的默认控制台代码页。还有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
请注意,无法在setlocale
中设置UTF-8,请参阅原始问题