我有一个函数如下:
void utf8_trim_end(char *data, int length){
int bytecount = 1;
int idx = length;
char *current = data;
for (int i = 0; i < length; i += bytecount){
if (!iswhitespace(&data[i])){
idx = i;
}
bytecount = utf8_bytecount(&data[i], length-i);
}
data[idx] = 0;
}
字符串
正如你所看到的,为了确保我们看到的是一个多字节字符的开始,我们从开头开始,然后遍历。这是可行的,但是对于长字符串来说,它很慢。我想知道是否有一种可以接受的方法从结尾开始,然后从那里向后工作?(另外,不寻找库,想自己做这个)
1条答案
按热度按时间tyu7yeag1#
你可以走到最后,向后工作。
所有的UTF-8多字节字符都表示为一个起始字节,后面跟着一些“延续”字节,其数量可以通过检查起始字节来确定。所有的延续字节都是
0b10xx xxxx
的形式。因此,无论您在UTF-8字符串中的哪个位置,如果您在延续字节上,你可以向前 * 或向后 * 扫描以跳过连续字节并找到起始字节。从UTF-8流中查找和识别Unicode空白字符,向后阅读,将有点麻烦,但留给读者作为练习!
(The编码在一个很好的Wikipedia article中描述)。