私はUnicode文字を繰り返し、最初のコードポイントに続くすべての組み合わせ文字を拾い読みしたいと思います。Unicode文字を反復するには? (コードポイントではありません)
これは私がこれまで行ってきたことですが、私が試したいくつかのランダムなUnicodeシーケンスのためには本当に変です(例えば、 "a̔"のようなものを渡すと(U + 0061 LATIN SMALL LETTER A、 0314「反転したCOMMAを組み合わせる」)それは1つではなく2つの文字であると見なされます。「e︠」(U + 0065 LATIN SMALL LETTER Eと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;
}
これはどのライブラリですか( 'utf8_t'、' utf8_index_t'、 'decode_cp')? ICUを使用できますか? – kennytm
"1つではなく2つの文字として表示されます"。彼らは2つの文字ですから。 graphemesを考えています。 – leonbloy
おそらく、私は明確にすべきであったはずです。私は小さなユニコード処理ライブラリを書いています。主にユニコードの詳細を学ぶためです。そして、私は文章について話していると思います。なぜなら、それらをテキストの原子単位として扱うと便利だと思うからです。 – Robin