如何使用printf打印unicode代码点

xuo3flqw  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(349)

我一直在尝试使用printf打印unicode字符串。我看了一些其他的答案设置语言环境,也设置控制台输出的窗口使用SetConsoleOutputCP。然而,有一个问题,我找不到答案。这里是代码样本测试。

#include <stdio.h>
#include <locale.h>
#include <windows.h>

int main()
{
    setlocale(LC_ALL, "en_US.UTF-8");
    SetConsoleOutputCP(CP_UTF8);

    printf("È\n");          // <-- This line prints È as expected
    printf("\u00C8\n");     // <-- This line does not print anything at all, not even a new line

    return 0;
}

正如评论中提到的printf("\u00C8\n");在windows上不打印任何东西,但在Linux上可以完美地工作。我想知道为什么以及如何让它打印适当的unicode字符。

lf3rwulv

lf3rwulv1#

字符\u00C8(带抑音符的拉丁大写字母E)的UTF-8编码是\xc3\x88,因此对于使用UTF-8的编译器,"È\n""\u00C8\n"都等价于"\xc3\x88\n"
如果使用MSVC,那么默认情况下"\u00C8\n"不会生成UTF-8字符串。MSVC使用 default codepage。如果使用CP-1252,那么字符\u00C8的代码恰好是\xc8,并且该代码被插入到字符串中。显然,它在UTF-8 codepage.Demo中不起作用。
您需要使用/utf-8编译器开关使MSVC从通用字符名称生成UTF-8字符。如果这样做,则“\u00C8\n”和"È\n"将生成完全相同的字符串(前提是您的源文件是UTF-8编码的)。Demo

相关问题