UTF-8编码字符串的字符串长度

时间:2014-06-19 18:12:49

标签: unicode encoding utf-8

如何从UTF-8编码的字符串中删除重音?有数百个答案可以使用某些库函数或使用转换表。

我正在寻找实际的算法(背后的想法及其工作原理),而不是随时可用的实现。

我的目标是计算UTF-8编码字符串中的单个字符(例如,utf8_strlen("Vypočítávání") = 12。我想计算任何字符串的长度,包括中文或克林贡语。

我已经知道如何计算多字节字符:如果当前字节的MSB是1,那么我知道会有更多的字节存在。看下几个字节,我可以说:

  • 110xxxxx表示将再跟一个字节,
  • 1110xxxx两个,
  • 11110xxx三。

(我们可以假设字符串编码正确,即序列是有效的UTF-8流。这意味着那些字节实际上将遵循。)

我读了一个字节,我知道有多少跟随指定一个Unicode代码点,所以我可以跳过这些(再次,流是有效的)并相应地增加中间和。

如何组合字符?也就是说,是否有直接的方法来判断代码点是否是重音(例如č中的háčekç中的 cedilla 任何奇怪的曲线中文)? 如果有,那么我也期待着跳过它们。

非常感谢!

2 个答案:

答案 0 :(得分:2)

您必须将UTF-8序列实际解码为Unicode代码点(即,将UTF-8转换为UTF-32),然后您可以根据需要操作代码点,然后将剩余的代码点重新编码回UTF-8如果需要的话。

由于您已经知道如何解析每个UTF-8八位字节以检测每个序列的字节数,只需取每个完整的1-4字节序列,将剩余的位解析成32位值,在Unicode图表中查找该值即可知道无论是重音,变音或其他组合字符,然后采取相应行动。您还应该对已解码的代码点值进行标准化,以使组合字符更易于检测或跳过。

答案 1 :(得分:2)

要做到这一点,你必须阅读TR29(UNICODE TEXT SEGMENTATION),分成“字形集群”,然后计算集群的数量。