将UTF-8转换为UTF-32,预先计算每个中的"字符"数

Nic*_*ter 2 c++ utf-8 string-conversion utf-32

我有一个工作算法将UTF-8字符串转换为UTF-32字符串,但是,我必须提前为我的UTF-32字符串分配所有空间.有没有办法知道UTF-32中有多少字符会占用UTF-8字符串.

例如,UTF-8字符串"¥0"是3个字符,一旦转换为UTF-32,则是2个无符号字符.有没有办法知道转换之前我需要的UTF-32'字符数'?或者我将不得不重新编写算法?

Edw*_*per 7

有两个基本选项:

  1. 您可以通过UTF-8字符串进行两次传递,第一次是计算您需要生成的UTF-32字符数,第二次是将它们写入缓冲区.

  2. 分配您可能需要的最大32位字符数 - 即UTF-8字符串的长度.这浪费了内存,但意味着你可以一次性转换utf8-> utf32.

您也可以使用混合 - 例如,如果字符串短于某个阈值,则使用第二种方法,否则使用第一种方法.

对于第一种方法,第一遍看起来像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)