当使用
setlocale()
将程序的语言环境更改为意大利语时,代码仅在使用 setlocale(LC_ALL, "")
时才按预期工作,而在使用 setlocale(LC_ALL, "it-IT")
时则不然。
我目前正在使用 Dev C++ 及其默认编译器,我的操作系统是 windows 10。
我尝试检查
setlocale(LC_ALL, "it-IT")
的返回值,它返回了NULL
。
我尝试使用不同的区域设置名称,以防在查找区域设置时出错,我尝试使用 "it_IT"
和 "it"
,并尝试将 .utf8
放在两个版本的区域设置名称的末尾。
具体用例是一个
printf
,里面有一个 è
。当代码按预期工作时,我会在输出中得到一个 è
,如果没有,我会得到我认为是希腊字符的内容。
最小可重现示例:
#include <stdio.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "");
printf("è");
return 0;
}
此代码按预期工作并给出“è”作为输出
#include <stdio.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "it-IT");
printf("è");
return 0;
}
此代码无法按预期工作,并给出“Þ”作为输出(我之前提到的区域设置名称的其他值也会发生同样的情况)。不设置区域设置也会给出相同的结果
如前所述,C 源文件的编码(应用于包含的文字)与操作系统支持(并激活)的编码(在 Windows 中,这是“代码页”)之间存在冲突。
我不确定这与“it-IT”语言环境的关系,并且我无法始终重现该问题。但你可以尝试这样的事情:
#include <stdio.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "it-IT.utf8");
printf("è");
return 0;
}
但是用UTF8编码保存你的源文件。 (如果您使用的是 Visual Studio Code,请在底部工具栏中查找编码标记。请参阅在 Visual Studio Code 中更改文件的编码)。