1

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;
}
4

1 に答える 1

3

実際、Unicode文字はほとんどUnicodeコードポイントに対して1:1です。関心があるのは、いわゆるユーザー認識文字に対応するUnicode書記素クラスターです。

プロパティデータを含むアルゴリズムの私の実装は、ここbitbucketで見つけることができます。

完全なアルゴリズムに興味がない場合は、次を使用できます

gc_break_property(c) == GC_BP_Extend

プロパティGrapheme_Extendおよび

gc_break_property(c) & GC_FLAG_POSTFIX

間隔マークも含めたい場合。

于 2012-04-30T13:11:41.197 に答える