Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置区域设置后,scanf printf调用会弄乱非ASCII字符_C_Windows_Character Encoding_Console Application_Locale - Fatal编程技术网

设置区域设置后,scanf printf调用会弄乱非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

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

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,请参阅原始问题