2 つの基本的なオプションがあります。
UTF-8 文字列を介して 2 つのパスを作成できます。最初のパスは生成する必要がある UTF-32 文字の数をカウントし、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;
}