我想打印单词“č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/