我想遍历 Unicode 字符,吞噬所有遵循初始代码点的组合字符。
到目前为止,这是我所拥有的,但是对于我尝试过的一些随机 Unicode 序列,它的行为真的很奇怪:(例如,当我传递它时,像“a̔”(U+0061 LATIN SMALL LETTER A 后跟 U+0314 COMBINING REVERSED COMMA ABOVE) 将其视为两个字符而不是一个字符。其他内容,如“e︠”(U+0065 拉丁小写字母 E 后跟 U+FE20 组合连字左半边)被视为一个字符)
int COMBINING[] = {
0x0300, 0x036F,
0x1DC0, 0x1DFF,
0x20D0, 0x20FF,
0xFE20, 0xFE2F,
0 //sentinel
};
utf8_index_t ut_nextchar(utf8_t source, utf8_index_t curr)
{
int c = decode_cp(source, &curr);
int comb = 0;
if (c == 0)
return -1;
while (COMBINING[comb] != 0)
{
for (comb = 0; COMBINING[comb] != 0; comb += 2)
{
if (c >= COMBINING[comb] && c <= COMBINING[comb + 1])
{
c = decode_cp(source, &curr);
if (c == 0)
return -1;
break;
}
}
}
return curr;
}