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

Unicode UTF-8编码字符串的字符串长度,unicode,encoding,utf-8,Unicode,Encoding,Utf 8,如何从UTF-8编码的字符串中删除重音符号?有数百种答案要么使用一些库函数,要么使用转换表 我在寻找实际的算法(背后的想法和它的工作原理),而不是现成的实现。 我的目标是计算UTF-8编码字符串中的单个字符(例如,utf8_strlen(“Vypočtávání”)=12。我想计算任何字符串的长度,包括中文或克林贡语 我已经知道如何计算多字节字符数:如果当前字节的MSB为1,则我知道还会出现一些字节。查看接下来的几个字节,我可以看出: 110xxxxx表示后面还会有一个字节 1110xxxx

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

我在寻找实际的算法(背后的想法和它的工作原理),而不是现成的实现。

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

我已经知道如何计算多字节字符数:如果当前字节的MSB为
1
,则我知道还会出现一些字节。查看接下来的几个字节,我可以看出:

  • 110xxxxx
    表示后面还会有一个字节
  • 1110xxxx
  • 11110xxx
    3个
(我们可以假设字符串编码正确,即序列是有效的UTF-8流。这意味着这些字节将实际跟随。)

我读了一个字节,知道有多少个字节表示一个Unicode码点,所以我可以跳过这些字节(同样,流是有效的),并相应地增加中间和

对于组合字符,我该怎么做呢?也就是说,有没有一种简单的方法来判断一个代码点是否是重音(例如
č
中的háček或
ç
中的cedilla或汉语中的任何奇怪曲线)? 如果有的话,我也期待着跳过它们


非常感谢!

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


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

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


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

要正确执行此操作,您必须读取(UNICODE文本分割),将其分割为“grapheme clusters”,然后计算簇数。

要正确执行此操作,您必须读取(UNICODE文本分割),将其分割为“grapheme clusters”,然后计算集群的数量。

是的,有一种简单的方法可以做到这一点。不幸的是,这种简单的方法不是一种算法,而是在Unicode标准中提供的庞大数据表中进行表查找。它们为每个代码点指定了各种属性,包括您要查找的代码点。不清楚您需要什么重新提问。标题与问题的内容不匹配。问题似乎暗示口音是使用组合字符表示的,在大多数情况下,byt不是。处理字节在这里真的是无关紧要的;它在概念上和编程中处于完全不同的级别。您还没有定义le的含义字符串的长度。是的,有一种简单的方法可以做到这一点。不幸的是,这种简单的方法不是一种算法,而是在Unicode标准中提供的巨大数据表中进行表查找。它们为每个代码点指定各种属性,包括您要查找的代码点。不清楚您要问什么。标题是什么es与问题的内容不匹配。问题似乎暗示重音是使用组合字符表示的,在大多数情况下,byt不是。处理字节在这里实际上是不相关的;它在概念上和编程中处于完全不同的级别。而且您还没有定义字符串长度的含义。+1更详细的答案(具有相同的结论)请参见。(示例中使用JavaScript,但大多数底层技术都是Unicode特有的,适用于任何编程语言。)+1更详细的答案(具有相同的结论)请参见。(示例中使用JavaScript,但大多数底层技术都是Unicode特有的,适用于任何编程语言。)