我有一个将 UTF-8 字符串转换为 UTF-32 字符串的有效算法,但是,我必须提前为我的 UTF-32 字符串分配所有空间。有什么方法可以知道 UTF-8 字符串将占用多少个 UTF-32 字符。
例如,UTF-8 字符串“¥0”是 3 个字符,转换为 UTF-32 后是 2 个无符号整数。有什么方法可以知道在进行转换之前我需要多少 UTF-32 'chars'?还是我将不得不重新编写算法?
我有一个将 UTF-8 字符串转换为 UTF-32 字符串的有效算法,但是,我必须提前为我的 UTF-32 字符串分配所有空间。有什么方法可以知道 UTF-8 字符串将占用多少个 UTF-32 字符。
例如,UTF-8 字符串“¥0”是 3 个字符,转换为 UTF-32 后是 2 个无符号整数。有什么方法可以知道在进行转换之前我需要多少 UTF-32 'chars'?还是我将不得不重新编写算法?
有两个基本选项:
您可以通过 UTF-8 字符串进行两次传递,第一次计算需要生成的 UTF-32 字符数,第二次实际将它们写入缓冲区。
分配您可能需要的最大 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;
}