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