提问人:Alexander Jonsson 提问时间:7/1/2023 最后编辑:chqrlieAlexander Jonsson 更新时间:7/1/2023 访问量:171
在 C 中打印带有 UTF8 字符的字符串
printing a string with UTF8 characters in C
问:
我想使用 UTF-8 打印,但我不知道该怎么做。UTF-8 为 62,为 6c,为 c3 a5。我不确定该如何处理这个角色。这是我的代码:blå
b
l
å
å
#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 函数。因此,我不明白为什么我的第二个和/或第三个代码不起作用。我唯一的解决方案是包括更改 和 的编码,尽管我不确定这是否有效,也不确定如何实现它。setmode
stdin
stdout
总结:
为什么我的代码不起作用?
我在 Windows 和 VScode 上,MINGW32作为编译器。
答:
您的第二次尝试是正确的,并且会根据需要输出 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 中设置控制台编码?
评论
wchar_t
wchar_t
char16_t
char32_t
char
char8_t