如何从UTF-8编码的字符串中删除重音?有数百个答案可以使用某些库函数或使用转换表。
我正在寻找实际的算法(背后的想法及其工作原理),而不是随时可用的实现。
我的目标是计算UTF-8编码字符串中的单个字符(例如,utf8_strlen("Vypočítávání") = 12
。我想计算任何字符串的长度,包括中文或克林贡语。
我已经知道如何计算多字节字符:如果当前字节的MSB是1
,那么我知道会有更多的字节存在。看下几个字节,我可以说:
110xxxxx
表示将再跟一个字节,1110xxxx
两个,11110xxx
三。(我们可以假设字符串编码正确,即序列是有效的UTF-8流。这意味着那些字节实际上将遵循。)
我读了一个字节,我知道有多少跟随指定一个Unicode代码点,所以我可以跳过这些(再次,流是有效的)并相应地增加中间和。
如何组合字符?也就是说,是否有直接的方法来判断代码点是否是重音(例如č
中的háček或ç
中的 cedilla 或任何奇怪的曲线中文)?
如果有,那么我也期待着跳过它们。
非常感谢!
答案 0 :(得分:2)
您必须将UTF-8序列实际解码为Unicode代码点(即,将UTF-8转换为UTF-32),然后您可以根据需要操作代码点,然后将剩余的代码点重新编码回UTF-8如果需要的话。
由于您已经知道如何解析每个UTF-8八位字节以检测每个序列的字节数,只需取每个完整的1-4字节序列,将剩余的位解析成32位值,在Unicode图表中查找该值即可知道无论是重音,变音或其他组合字符,然后采取相应行动。您还应该对已解码的代码点值进行标准化,以使组合字符更易于检测或跳过。
答案 1 :(得分:2)
要做到这一点,你必须阅读TR29(UNICODE TEXT SEGMENTATION),分成“字形集群”,然后计算集群的数量。