计算特殊 UTF-8 字符

本文关键字:字符 UTF-8 计算 | 更新日期: 2023-09-27 18:37:16

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

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

提前谢谢你=)

计算特殊 UTF-8 字符

使用 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。

一个小吹毛求疵:.NET 中的string使用 UTF-16,而不是 UTF-8


当您谈论字符串的长度时,您可能意味着几种不同的东西:

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

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

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

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