c - 在 C 中打印 UTF-8 字符串的字节

标签 c encoding utf-8

我想打印单词“česnek”的各个字节,期望 printf 7 个字节,因为“č”以 2 个字节编码,但它确实打印了垃圾字符,例如终端中的问号。如果我打印出整数值,我会得到这个序列。

-60 -115 101 115 110 101 107

为什么前两个数字是负数? 这是我用来尝试的代码。

 char *utfstring = "česnek";
 for(size_t i = 0; i < strlen(utfstring); i++) {
 printf("%c ", utfstring[i]);
 }
 for(size_t i = 0; i < strlen(utfstring); i++) {
 printf("%d ", utfstring[i]);
 }

我希望前两个值是 c4 8d,因为 č 是根据 https://www.utf8-chartable.de/unicode-utf8-table.pl?start=256&unicodeinhtml=dec 编码的

最佳答案

使用(unsigned char)utfstring[i]0xFF & utfstring[i]得到十六进制输出如下:

char *utfstring = u8"česnek";
for(size_t i = 0; i < strlen(utfstring); i++)
    printf("%02X ", 0xFF & utfstring[i]);

输出:

"C4 8D 65 73 6E 65 6B"

第一个字母字符 č 不能用 UTF8 中的单个字节表示。如果您一次打印一个字节的 utfstring,那么 UTF8 编码就会被破坏。

它必须打印为 u8"č"u8"\xC4\x8D"

如果您希望将字节序列分解为单独的 Unicode 代码点,通常您需要一个 Unicode 库,例如 iconv。如果您只是想查找 č,请使用标准字符串函数,例如 strstr(utfstring, u8"č")

关于c - 在 C 中打印 UTF-8 字符串的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53160797/

相关文章:

c - 嵌套很多while循环有问题吗?

javascript - 在 Angular 中向具有不同重音的对象添加属性

java - 如何读取具有特定字符编码的 Java 文件?

php - UTF-8贯穿始终

c# - 将 Word 保存为 UTF-8 编码的 HTML

ruby - 在 Ruby 1.8.7 中使用 string[range]=new_val 同时尊重 UTF8

c - uint 和 unsigned int 之间的区别?

c - 如何在 C 中使用指针传递信息

c - 添加迄今为止的天数后结果不正确

python - 如何将四个 float 压缩为一个字符串?