7

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

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

提前谢谢你=)

4

2 回答 2

11

使用StringInfo.LengthInTextElements

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

这种行为的解释可以在String.Length的文档中找到:

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

于 2012-06-15T17:05:03.303 回答
6

一个小问题:string.NET 中的 s 使用 UTF-16,而不是 UTF-8


当您谈论字符串的长度时,您可能意味着以下几种不同的含义:

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

在您的情况下,您的困惑源于 4. 和 3. 之间的区别。 3. 是 C# 使用的,4. 是您所期望的。泰米尔语等复杂的文字使用连字和变音符号。连字是将两个或多个相邻字符压缩成一个字形 - 在您的情况下,ழை 是 ழ 和 ை 的连字 - 后者会改变前者的外观;வா也是这样的连字。变音符号是字母周围的装饰,例如 à 中的重音或 ப் 上方的点。

我提到的两种情况都产生了一个字素(你认为是一个字符),但它们都需要两个实际字符。所以你最终在字符串中多了三个代码点。

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

于 2012-06-15T17:08:58.783 回答