2014-06-19 143 views
0

如何从UTF-8编码字符串中删除重音符号?有数百个答案要么使用某些库函数,要么使用转换表。UTF-8编码字符串的字符串长度

我正在寻找实际的算法(背后的想法和它为什么工作),而不是一个准备好使用的实现。

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

我已经知道怎么算多字节字符:如果当前字节的最高位为1,那么我就知道一些更多的字节将出席放眼未来几个字节,我可以告诉大家的是:

  • 110xxxxx意味着多了一个字节将会跟着,
  • 1110xxxx另外两个,
  • 11110xxx三。

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

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

我该如何做相同的字符组合?也就是说,有一个简单的方法来告诉代码点是否例如(如HACEKčç在中国任何奇怪的曲线加符)口音? 如果有,那么我也期待跳过它们。

非常感谢!

+1

是的,有一种简单的方法可以做到这一点。不幸的是,这种直接的方式不是一种算法,而是在作为Unicode标准一部分的大型数据表中查找表格。他们为每个代码点指定各种属性,包括您之后的代码。 – jalf

+0

目前还不清楚你在问什么。标题与问题的内容不匹配。这个问题似乎意味着口音是通过结合字符呈现的,在大多数情况下,它们不是。处理字节在这里真的不相关。它在概念上和编程上处于完全不同的水平。你还没有定义一个字符串的长度。 –

回答

2

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

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

2

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

+0

+1有关更详细的答案(具有相同的结论),请参阅[*** JavaScript有一个Unicode问题***](http://mathiasbynens.be/notes/javascript-unicode#counting-symbols)。 (它使用JavaScript作为示例,但大多数底层技术都是Unicode特定的,适用于任何编程语言。) –