c ++字符串擦除不适用于UTF8字符串,我可以使用哪个库?

时间:2014-04-15 18:54:58

标签: c++ string utf-8 insert erase

程序:

void foo() {

    string sourceStr = "Tag:贾鑫@VoltDB";
    string insertStr = "XinJia";
    int start = 4;
    int length = 2;

    sourceStr.erase(start, length);
    sourceStr.insert(start, insertStr);
    cout << sourceStr << endl;
}

对于这个程序,我希望输出为“Tag:XinJia @ VoltDB”,但似乎std字符串erase和insert对UTF-8字符串不起作用。

我可以使用任何升级库吗?我该如何解决这个问题?


与他人交谈后,我意识到没有可以解决这个问题的标准库。所以我写了一个函数来完成我的工作,并希望与有类似问题的其他人分享:

std::string overlay_function(const char* sourceStr, size_t sourceLength,
        std::string insertStr, size_t startPos, size_t length) {
    int32_t i = 0, j = 0;
    while (i < sourceLength) {
        if ((sourceStr[i] & 0xc0) != 0x80) {
            if (++j == startPos) break;
        }
        i++;
    }
    std::string result = std::string(sourceStr, i);
    result.append(insertStr);

    bool reached = false;
    j = 0;
    while (i < sourceLength) {
        if ((sourceStr[i] & 0xc0) != 0x80) {
            if (reached) break;
            if (++j == length) reached = true;
        }
        i++;
    }

    result.append(std::string(&sourceStr[i], sourceLength - i));
    return result;
}

有了这个功能,我的程序可以是:

cout << overlay_function(sourceStr, sourceStr.length(), 4+1, 2) << endl;

希望它有所帮助。

1 个答案:

答案 0 :(得分:0)

C ++字符串中的索引是编码值索引,而不是字符(或在您的案例表意文字中)索引。使用UTF-8,每个字符可以由多个编码单元组成,在您的情况下也是如此。找到正确的编码单位索引。

提示1:我为此使用.substr+字符串连接。

提示2:您似乎可以搜索字符:@。请注意,这些编码单元不能出现在多单元UTF-8字符中。查看string

的方法