在不了解UTF-8编码的情况下,将一个UTF-8编码的字符串按空格字符分割。

5
我想要在每个空白字符(' ','\n','\r','\t','\v','\f')处拆分一个字符串。该字符串以UTF8编码存储在字节数组(char*,向量或字符串)中。
我可以直接在每个分割字符处拆分字节数组吗?换句话说,我能确定对这些字符进行编码的字节值不能在多字节字符中找到吗?从UTF-8规范来看,所有多字节字符只有高于128的字节。
谢谢。

3
如果您受限于UTF8,答案是肯定的。这是唯一同步的选项。 - Adriano Repetti
1
如@AdrianoRepetti所说,您可以毫无问题地完成此操作,但是:Unicode具有更多的空格符(其他所有符号都> 127)。根据您要处理的内容,这些空格符也应该被处理。 - deviantfan
关于在代码点边界处分割,是的。但是,尽管这不太可能适用于您提到的代码点,但有些代码点是“组合字符”,它们跟随并绘制在基本字符上,形成“字形”。因此,您需要在字形边界而不是代码点或代码单元边界处进行拆分。 - Tom Blodget
2个回答

4

可以的。

多字节序列必定包括一个导向字节(两个 MSB 等于 11)和一个或多个续补字节(两个 MSB 等于 10)。多字节序列的总长度(导向字节+续补字节)等于导向字节中第一个 0 出现之前 MSB 等于 1 的个数(例如:如果导向字节为 110xxxxx,则应该跟随一个续补字节;如果是 11110xxx,则应该跟随三个续补字节)。

因此,如果您发现了短的 MB 序列或没有导向字节的活动续补字节,则您的字符串可能无效,而您的分割程序也不会使其更糟。

但有一点需要注意的是:Unicode 在上部非 ASCII 兼容范围内引入了其他“空白”符号。您可能需要相应地对它们进行处理。


2
如果你仅限于提到的空格字符集,答案肯定是“是”。当然,首先要检查你的文本是否有效的UTF-8编码存在一个问题...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接