如何在C++中删除UTF-8字符串的最后一个字符?

Ite*_*tor 2 c++ string unicode utf-8 c++11

文本存储在std::string.

如果文本是8位ASCII,那么它很容易:

text.pop_back();
Run Code Online (Sandbox Code Playgroud)

但如果它是UTF-8文本怎么办?
据我所知,标准库中没有与UTF-8相关的函数可以使用.

Gal*_*lik 5

如果你要使用,你真的需要一个UTF-8库UTF-8.但是对于这项任务,我认为这样的事情就足够了:

void pop_back_utf8(std::string& utf8)
{
    if(utf8.empty())
        return;

    auto cp = utf8.data() + utf8.size();
    while(--cp >= utf8.data() && ((*cp & 0b10000000) && !(*cp & 0b01000000))) {}
    if(cp >= utf8.data())
        utf8.resize(cp - utf8.data());
}

int main()
{
    std::string s = "?????";

    while(!s.empty())
    {
        std::cout << s << '\n';
        pop_back_utf8(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

?????
????
???
??
?
Run Code Online (Sandbox Code Playgroud)

它依赖于UTF-8编码有一个起始字节后跟几个连续字节的事实.可以使用提供的按位运算符检测那些连续字节.

  • 如果你使用组合字形,这仍然是一个问题:`κόσÄÄμεκόσÄÄμκόσÄÄκόσÄAκόσÄκόσκόκ` (2认同)