为什么下面的程序
#包括<;标准h>;
#包括<;wchar.h>;
int main(){
wprintf(L“Пццццц,ццццц!”);
}
“打印”;女贞,和平号&引用;在Linux上?具体来说,为什么它要将Unicode中的俄语文本音译为拉丁语,而不是将其转换为UTF-8或使用替换字符
在锁紧螺栓上演示此行为:https://godbolt.org/z/36zEcG
非宽版printf(“ПППицццц,ццц!”)
按预期打印此文本(“ППццц,цццц!”)
因为宽字符的转换是根据当前设置的区域设置完成的。默认情况下,C程序总是以“开始”;”;仅支持ASCII字符的区域设置
您必须首先切换到任何俄语或UTF-8语言环境:
setlocale(LC_ALL,";ru_ru.utf8";)//俄文Unicode
setlocale(LC_ALL,“en_US.utf8”)//英美统一码
或当前系统区域设置(这可能是您需要的):
setlocale(LC_ALL,";);
整个计划将是:
#包括<;标准h>;
#包括<;wchar.h>;
#包括<;locale.h>;
int main(){
setlocale(LC“u ALL”、“ru”ru.utf8);
wprintf(L“ППццццц,цццц!\n”);
}
至于您的代码在其他机器上的工作方式,这是由于libc在那里的操作方式。某些实现(如musl)不支持非Unicode区域设置,因此可以无条件地将宽字符转换为UTF-8序列