2

我有一个将 UTF-8 字符串转换为 UTF-32 字符串的有效算法,但是,我必须提前为我的 UTF-32 字符串分配所有空间。有什么方法可以知道 UTF-8 字符串将占用多少个 UTF-32 字符。

例如,UTF-8 字符串“¥0”是 3 个字符,转换为 UTF-32 后是 2 个无符号整数。有什么方法可以知道在进行转换之前我需要多少 UTF-32 'chars'?还是我将不得不重新编写算法?

4

1 回答 1

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;
}
于 2012-05-24T19:39:30.650 回答