将 UTF-8 转换为 UTF-32,预先计算每个'chars'数

Converting UTF-8 to UTF-32, pre-calculating the number of 'chars' in each

本文关键字:chars 计算 转换 UTF-8 UTF-32      更新时间:2023-10-16

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

例如,UTF-8 字符串"¥0"是 3 个字符,转换为 UTF-32 后是 2 个无符号整数。在进行转换之前,有没有办法知道我需要的 UTF-32"字符"数量?还是我将不得不重写算法?

有两个基本选项:

  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;
}