因此,我正在尝试根据二进制表示形式确定utf-8字符的宽度(以字节为单位)。然后,计算utf8字符串中的字符数。下面是我的代码。
#include <stdlib.h>
#include <stdio.h>
static const char* test1 = "?f";
static const char* test2 = "????????";
unsigned utf8_char_size(unsigned char val) {
if (val < 128) {
return 1;
} else if (val < 224) {
return 2;
} else if (val < 240) {
return 3;
} else {
return 4;
}
}
unsigned utf8_count_chars(const unsigned char* data)
{
unsigned total = 0;
while(*data != 0) {
unsigned char_width = utf8_char_size(*data);
total++;
data += char_width;
}
return total;
}
int main(void) {
fprintf(stdout, "The count is %u\n", utf8_count_chars((unsigned char*)test1));
fprintf(stdout, "The count is %u\n", utf8_count_chars((unsigned char*)test2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我The count is 2在上面进行了第一次测试。这对于第一个test2字母有意义,但对于第二个字母,带有4个泰语字母,则输出8,这是不正确的。
我想知道我的代码在做什么错,而且,我想知道unsigned char在C中给定的数组中,一个数组如何作为utf-8字符遍历字节?
该代码既不测量字符也不标识符号,而是测量代码点。一个字符可以由多个Unicode代码点组成。在这种情况下,泰语文字有8个代码点。
在Python中,Unicode字符串比在C语言中更易于检查,因此这是使用内置Unicode数据库的一个小型Python 3.6演示:
>>> import unicodedata
>>> for i in '????????':
... print(f'{ord(i):04X} {unicodedata.name(i)}')
...
0E14 THAI CHARACTER DO DEK
0E49 THAI CHARACTER MAI THO
0E14 THAI CHARACTER DO DEK
0E35 THAI CHARACTER SARA II
0E14 THAI CHARACTER DO DEK
0E49 THAI CHARACTER MAI THO
0E14 THAI CHARACTER DO DEK
0E35 THAI CHARACTER SARA II
Run Code Online (Sandbox Code Playgroud)