c++字符串擦除不适用于UTF8字符串,我可以使用什么库

c++ string erase does not work for UTF8 string, what library can I use?

本文关键字:字符串 可以使 我可以 什么 UTF8 擦除 不适用 适用于 c++      更新时间:2023-10-16

程序:

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

对于这个程序,我希望输出为"标记:XinJia@VoltDB",但std字符串擦除和插入似乎不适用于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;

希望能有所帮助。

C++字符串中的

索引是编码值索引,而不是字符(或者在您的情况下是表意字符)索引。使用UTF-8,每个字符可以由多个编码单元组成,在您的情况下也是如此。请查找正确的编码单元索引。

提示1:我将使用.substr+字符串串联。

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