Unicode文字を繰り返し処理し、最初のコードポイントに続くすべての結合文字をゴブリングしたいと思います。
これは私がこれまでに持っているものですが、私が試したいくつかのランダムなUnicodeシーケンスでは本当に奇妙に動作します:(たとえば、「ạ」(U + 0061 LATIN SMALLLETTERAの後にU+0314 COMBINING REVERSED COMMA)のように渡すと上記)1文字ではなく2文字として表示されます。「e︠」(U + 0065 LATIN SMALLLETTEREの後にU+FE20 COMBINING LIGATURE LEFT HALF)などの他の文字は1文字として表示されます)
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;
}