2012-04-30 10 views
1

私は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; 
} 
+0

これはどのライブラリですか( 'utf8_t'、' utf8_index_t'、 'decode_cp')? ICUを使用できますか? – kennytm

+2

"1つではなく2つの文字として表示されます"。彼らは2つの文字ですから。 graphemesを考えています。 – leonbloy

+0

おそらく、私は明確にすべきであったはずです。私は小さなユニコード処理ライブラリを書いています。主にユニコードの詳細を学ぶためです。そして、私は文章について話していると思います。なぜなら、それらをテキストの原子単位として扱うと便利だと思うからです。 – Robin

答えて

3

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

the algorithmの実装は、property data,here at bitbucketなどがあります。

あなたが完全なアルゴリズムに興味を持っていないなら、あなたはGrapheme_Extend財産で文字をチェックする

gc_break_property(c) == GC_BP_Extend 

を使用することができますし、

gc_break_property(c) & GC_FLAG_POSTFIX 

あなたに間隔マークを含める場合よく