2

UTF-8 文字列を UTF-32 文字列に変換するアルゴリズムは動作していますが、事前に UTF-32 文字列にすべてのスペースを割り当てる必要があります。UTF-8 文字列が占める UTF-32 の文字数を知る方法はありますか。

たとえば、UTF-8 文字列 "¥0" は 3 文字であり、UTF-32 に変換されると 2 つの unsigned int になります。変換を行う前に必要な UTF-32 の「文字」の数を知る方法はありますか? それとも、アルゴリズムを書き直す必要がありますか?

4

1 に答える 1

7

2 つの基本的なオプションがあります。

  1. UTF-8 文字列を介して 2 つのパスを作成できます。最初のパスは生成する必要がある UTF-32 文字の数をカウントし、2 つ目はそれらを実際にバッファーに書き込みます。

  2. 必要になる可能性のある 32 ビット文字の最大数、つまり UTF-8 文字列の長さを割り当てます。これはメモリを浪費しますが、1 回のパスで utf8->utf32 を変換できることを意味します。

ハイブリッドを使用することもできます。たとえば、文字列があるしきい値よりも短い場合は 2 番目のアプローチを使用し、それ以外の場合は最初のアプローチを使用します。

最初のアプローチでは、最初のパスは次のようになります。

size_t len=0;  // warning: untested code.
for(const char *p=src; *p; ++p) {
    // characters that begin with binary 10xxxxxx... are continuations; all other
    // characters should begin a new utf32 char (assuming valid utf8 input)
    if ((*p & 0xc0) != 0x80) ++len;
}
于 2012-05-24T19:39:30.650 に答える