c# 如何在不阅读整个字符串的情况下删除utf8字符串的尾随空格以提高性能?

kx1ctssn  于 2023-11-15  发布在  C#
关注(0)|答案(1)|浏览(224)

我有一个函数如下:

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

字符串
正如你所看到的,为了确保我们看到的是一个多字节字符的开始,我们从开头开始,然后遍历。这是可行的,但是对于长字符串来说,它很慢。我想知道是否有一种可以接受的方法从结尾开始,然后从那里向后工作?(另外,不寻找库,想自己做这个)

tyu7yeag

tyu7yeag1#

你可以走到最后,向后工作。
所有的UTF-8多字节字符都表示为一个起始字节,后面跟着一些“延续”字节,其数量可以通过检查起始字节来确定。所有的延续字节都是0b10xx xxxx的形式。因此,无论您在UTF-8字符串中的哪个位置,如果您在延续字节上,你可以向前 * 或向后 * 扫描以跳过连续字节并找到起始字节。
从UTF-8流中查找和识别Unicode空白字符,向后阅读,将有点麻烦,但留给读者作为练习!
(The编码在一个很好的Wikipedia article中描述)。

相关问题