计算特殊的UTF-8字符

时间:2012-06-15 16:59:21

标签: c#

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

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

提前谢谢=)

2 个答案:

答案 0 :(得分:10)

使用StringInfo.LengthInTextElements

var text = "வாழைப்பழம";
Console.WriteLine(text.Length);                               // 9
Console.WriteLine(new StringInfo(text).LengthInTextElements); // 6

有关此行为的说明,请参阅String.Length的文档:

  

长度属性返回此实例中的Char对象数,而不是Unicode字符数。原因是Unicode字符可能由多个Char表示。使用System.Globalization.StringInfo类来处理每个Unicode字符而不是每个Char。

答案 1 :(得分:3)

.NET中的一个小挑剔:string使用UTF-16,而不是UTF-8


当你谈论字符串的长度时,你可能会指出几种不同的东西:

  1. 以字节为单位的长度。这是通常用于查看内容的旧C方式。
  2. Unicode代码点的长度。这使您更接近现代,应该是如何处理字符串长度的方式,除非它不是。
  3. UTF-8 / UTF-16代码单位的长度。这是最常见的解释,源自1.某些字符在这些代码中占用多个代码单元编码如果你不期望它会使事情变得复杂。
  4. 可见“字符”(字形)的数量。这通常是人们说字符或字符串长度时的含义。

  5. 在你的情况下,你的困惑源于4和3之间的差异.3。是C#使用的,4。是你所期望的。泰米尔语等复杂脚本使用连字和变音符号。连字是两个或多个相邻字符收缩成单个字形 - 在你的情况下ழை是ழ和lig的连字 - 后者改变了前者的外观; வா也是这样的结扎。变音符号是字母周围的饰物,例如在à或者上面的点上的重音。

    我提到的两个案例都会产生一个字形(你认为是单个字符),但它们都需要两个实际的字符。所以你最终在字符串中有三个代码点。

    有一点需要注意:对于你的情况,2和3之间的区别是无关紧要的,但通常你应该记住它。