计算特殊的UTF-8字符

Che*_*eng 7 c#

我正在寻找一种方法来计算由多个角色组成的特殊角色,但在网上找不到解决方案!

例如,我想计算字符串"வாழைப்பழம".它实际上由6个泰米尔字符组成,但在这种情况下,当我们使用常规方法查找长度时,它的9个字符.我想知道泰米尔是唯一会导致此问题的编码,如果有解决方案的话.我目前正在尝试在C#中找到解决方案.

提前谢谢=)

Hei*_*nzi 11

用途StringInfo.LengthInTextElements:

var text = "?????????";
Console.WriteLine(text.Length);                               // 9
Console.WriteLine(new StringInfo(text).LengthInTextElements); // 6
Run Code Online (Sandbox Code Playgroud)

可以在String.Length的文档中找到此行为的说明:

长度属性返回字符对象在这种情况下数量,而不是Unicode字符数.原因是Unicode字符可能由多个Char表示.使用System.Globalization.StringInfo该类来处理每个Unicode字符而不是每个Char.


Joe*_*oey 5

轻微的nitpick:string.NET中的s使用UTF-16,而不是UTF-8


当您谈论字符串的长度时,您可能会想到几件不同的事情:

  1. 长度(以字节为单位)。  通常,这是C语言看待事物的旧方法。
  2. Unicode代码点的长度。  这使您更接近现代,并且应该是处理字符串长度的方式,除非不是这样。
  3. 以UTF-8 / UTF-16代码单位单位的长度。  这是从1派生的最常见的解释。某些字符在这些编码中使用多个代码单元,如果您不希望这样做,则会使事情复杂化。
  4. 可见“字符”(字素)的计数。 这通常是人们说字符或字符串长度时的意思。

在您的情况下,您的困惑源于4.和3之间的差异。3. C#所使用的是3. C#是您所期望的。泰米尔语等复杂文字使用连字和变音符号。连字是将两个或多个相邻字符压缩成一个字形的方式–在您的情况下?是连字吗?和?–后者改变了前者的外观;?? 连字也是如此。变音符号是字母周围的装饰品,例如à上的重音或??上的点。

我提到的两种情况都导致一个单一的字素(您将其视为单个字符),但是它们每个都需要两个实际字符。因此,您最终在字符串中多了三个代码点。

需要注意的一件事:对于您的情况,2和3之间的区别无关紧要,但通常应牢记这一点。