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相关的函数可以使用.
如果你要使用,你真的需要一个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编码有一个起始字节后跟几个连续字节的事实.可以使用提供的按位运算符检测那些连续字节.