在 C 中打印带有 UTF8 字符的字符串

printing a string with UTF8 characters in C

提问人:Alexander Jonsson 提问时间:7/1/2023 最后编辑:chqrlieAlexander Jonsson 更新时间:7/1/2023 访问量:171

问:

我想使用 UTF-8 打印,但我不知道该怎么做。UTF-8 为 62,为 6c,为 c3 a5。我不确定该如何处理这个角色。这是我的代码:blåblåå

#include <stdio.h>

int main(void) {

    char myChar1 = 0x62;  //b
    char myChar2 = 0x6C;  //l
    char myChar3 = ??     //å

    printf("%c", myChar1);
    printf("%c", myChar2);
    printf("%c", myChar3);

    return 0;
}

我也试过这个:

#include <stdio.h>

#define SIZE 100

int main(void) {

    char myWord[SIZE] = "\x62\x6c\xc3\xa5\x00";

    printf("%s", myWord);

    return 0;
}

但是,输出为:

blå

最后,我试了一下:

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

#define SIZE 100

int main(void) {

    setlocale(LC_ALL, ".UTF8");
    char myWord[SIZE] = "\x62\x6c\xc3\xa5\x00";

    printf("%s", myWord);

    return 0;
}

与以前相同的输出。

我不确定我是否完全理解unicode。如果我理解正确的话,UTF-16 和 UTF-32 使用宽字符,其中每个字符需要相同数量的字节(UTF-16 为 2 或 4)。另一方面,UTF-8 使用宽字符,大小可能会有所不同(1-4 个字节)。我知道前 128 个字符需要 1 个字节,几乎所有的 latin-1 都可以用 2 个字节等来描述。由于 UTF-8 不需要宽字符,因此我不需要在代码中使用 wchar 函数。因此,我不明白为什么我的第二个和/或第三个代码不起作用。我唯一的解决方案是包括更改 和 的编码,尽管我不确定这是否有效,也不确定如何实现它。setmodestdinstdout

总结:

为什么我的代码不起作用?

我在 Windows 和 VScode 上,MINGW32作为编译器。

C UTF-8

评论

0赞 Remy Lebeau 7/1/2023
了解代码点和代码单元之间的区别。UTF-32 使用 32 位代码单元,其中每个 Unicode 代码点适合 1 个代码单元。UTF-16 使用 16 位代码单元,其中代码点 <= U+FFFF 适合 1 个代码单元,更高的代码单元适合 2 个代码单元(使用代理项)。UTF-8 使用 8 位代码单元,其中每个代码点适合 1-4 个代码单元,具体取决于其值......
0赞 Remy Lebeau 7/1/2023
在 Windows 上,类型为 2 个字节,在大多数其他平台上为 4 个字节。因此,用于 Windows 上的 UTF-16,以及其他地方的 UTF-32。现代编译器也有 和 用于处理 UTF-16/32。根据定义,该类型在所有平台上都是 1 字节。一些现代编译器也具有处理 UTF-8 的功能。wchar_twchar_tchar16_tchar32_tcharchar8_t

答:

4赞 Rob Napier 7/1/2023 #1

您的第二次尝试是正确的,并且会根据需要输出 UTF-8。问题是您的终端不显示 UTF-8。有关在 Windows 终端中显示 UTF-8 的讨论,请参阅在 PowerShell 中显示 Unicode在命令提示符/Windows Powershell (Windows 10) 中使用 UTF-8 编码 (CHCP 65001)。

您当前的配置是 0xc3 编码 ├ 的配置,这可能是 CP850,我相信这是一些基于 mingw 的终端(MSYS、git bash)的默认配置。我已经很久没有使用 mingw 了,但您可能还想看看如何在 MSYS 中设置控制台编码?

评论

0赞 Alexander Jonsson 7/1/2023
VSCode 是否使用 Windows Powershell?
0赞 Rob Napier 7/1/2023
这取决于你如何设置它。如果您用mingw配置了它,我不知道默认值是什么。我从不在 Windows 上使用 VSCode。如果你的问题专门与vscode有关,你可能需要添加适当的标签并调整你的问题,以获得专家的意见。我的专长是 C 和 UTF-8。