为什么wprintf在Linux上将Unicode中的俄语文本翻译成拉丁语?

为什么下面的程序

#包括<标准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序列

发表评论