C 这个UTF8到代码点的示例正确吗?
从C 这个UTF8到代码点的示例正确吗?,c,unicode,utf-8,C,Unicode,Utf 8,从 是吗?utf[0]是正确的。该条目适用于所有尾随字节utf[j]以长度顺序描述初始字节jutf[0]是否正确。该条目适用于所有尾随字节utf[j]描述长度序列中的初始字节j如何以及在何处定义utf数组?请在问题中包含所有必要的代码(创建)。指向外部网页的链接可能会消失。请复制/发布实际代码,而不是代码的某些链接二进制常量是gcc扩展,因此链接的代码不会与其他编译器一起编译链接网页上的代码甚至不接近编译,无论编译器和语言如何-算法正确吗?如何以及在何处定义utf数组?请在问题中包含所有必要的代
是吗?
utf[0]
是正确的。该条目适用于所有尾随字节utf[j]
以长度顺序描述初始字节j
utf[0]
是否正确。该条目适用于所有尾随字节utf[j]
描述长度序列中的初始字节j
如何以及在何处定义utf
数组?请在问题中包含所有必要的代码(创建)。指向外部网页的链接可能会消失。请复制/发布实际代码,而不是代码的某些链接二进制常量是gcc
扩展,因此链接的代码不会与其他编译器一起编译链接网页上的代码甚至不接近编译,无论编译器和语言如何-算法正确吗?如何以及在何处定义utf
数组?请在问题中包含所有必要的代码(创建)。指向外部网页的链接可能会消失。请复制/发布实际代码,而不是代码的某些链接二进制常量是gcc
扩展,因此链接的代码将不会与其他编译器一起编译链接网页上的代码甚至无法编译,无论编译器和语言如何——算法正确吗?
typedef struct {
char mask; /* char data will be bitwise AND with this */
char lead; /* start bytes of current char in utf-8 encoded character */
uint32_t beg; /* beginning of codepoint range */
uint32_t end; /* end of codepoint range */
int bits_stored; /* the number of bits from the codepoint that fits in char */
}utf_t;
utf_t * utf[] = {
/* mask lead beg end bits */
[0] = &(utf_t){0b00111111, 0b10000000, 0, 0, 6 },
[1] = &(utf_t){0b01111111, 0b00000000, 0000, 0177, 7 },
[2] = &(utf_t){0b00011111, 0b11000000, 0200, 03777, 5 },
[3] = &(utf_t){0b00001111, 0b11100000, 04000, 0177777, 4 },
[4] = &(utf_t){0b00000111, 0b11110000, 0200000, 04177777, 3 },
&(utf_t){0},
};
uint32_t to_cp(const char chr[4])
{
int bytes = utf8_len(*chr);
int shift = utf[0]->bits_stored * (bytes - 1);
uint32_t codep = (*chr++ & utf[bytes]->mask) << shift;
for(int i = 1; i < bytes; ++i, ++chr) {
shift -= utf[0]->bits_stored;
codep |= ((char)*chr & utf[0]->mask) << shift;
}
return codep;
}
shift -= utf[i]->bits_stored;
codep |= ((char)*chr & utf[i]->mask) << shift;