我正在寻找一种方法来计算由多个字符组成的特殊字符,但在网上找不到解决方案!
例如,我想计算字符串“வாழைப்பழம”。它实际上由 6 个泰米尔语字符组成,但在这种情况下,当我们使用正常方法来查找长度时,它是 9 个字符。我想知道泰米尔语是唯一会导致此问题的编码,以及是否有解决方案。我目前正在尝试在 C# 中找到解决方案。
提前谢谢你=)
我正在寻找一种方法来计算由多个字符组成的特殊字符,但在网上找不到解决方案!
例如,我想计算字符串“வாழைப்பழம”。它实际上由 6 个泰米尔语字符组成,但在这种情况下,当我们使用正常方法来查找长度时,它是 9 个字符。我想知道泰米尔语是唯一会导致此问题的编码,以及是否有解决方案。我目前正在尝试在 C# 中找到解决方案。
提前谢谢你=)
使用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。
一个小问题:string
.NET 中的 s 使用 UTF-16,而不是 UTF-8
当您谈论字符串的长度时,您可能意味着以下几种不同的含义:
在您的情况下,您的困惑源于 4. 和 3. 之间的区别。 3. 是 C# 使用的,4. 是您所期望的。泰米尔语等复杂的文字使用连字和变音符号。连字是将两个或多个相邻字符压缩成一个字形 - 在您的情况下,ழை 是 ழ 和 ை 的连字 - 后者会改变前者的外观;வா也是这样的连字。变音符号是字母周围的装饰,例如 à 中的重音或 ப் 上方的点。
我提到的两种情况都产生了一个字素(你认为是一个字符),但它们都需要两个实际字符。所以你最终在字符串中多了三个代码点。
需要注意的一件事:对于您的情况,2. 和 3. 之间的区别无关紧要,但通常您应该牢记这一点。