【问题标题】:Converting UTF-8 to UTF-32, pre-calculating the number of 'chars' in each将 UTF-8 转换为 UTF-32,预先计算每个字符中的“字符”数
【发布时间】:2012-05-24 19:35:17
【问题描述】:

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

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

【问题讨论】:

    标签: c++ utf-8 string-conversion utf-32


    【解决方案1】:

    有两个基本选项:

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

    【讨论】:

    • +1,一条评论:在选项 2 之后,如果之前分配了 malloc,则可以 realloc UTF-32 数组。理想情况下,这样你就不会浪费内存。
    • @quinmars 是的。这是否值得做可能取决于您打算将 utf32 字符串保留多长时间;如果您要保留它一段时间,那么值得尝试将其缩小。如果你打算使用它然后更快地释放它,那么它可能不值得。
    • 我自己倾向于选择#1。它需要更多的编码和更多的运行时间,但它的好处是能够让第一遍检查输入以确保在计数时它是有效的 UTF-8,然后再为第二遍分配任何内存.
    • 你不是说if ((*p & 0xc0) != 0x80) ++len;吗?
    • @masaers 是的,我做到了。感谢您指出这一点——我刚刚修好了。
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 2016-04-03
    • 2011-06-25
    • 2013-03-02
    • 1970-01-01
    • 2016-10-18
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多