测量包含宽字符的字符串长度

7

我有以下字符串:

友又

相应的UTF-16表示(小端)为:
CB 53 40 D8 87 DC C8 53
\___/ \_________/ \___/
  友              又

"友又".Length 返回4,因为CLR将字符串存储为4个2字节字符。

如何测量字符串的长度?如何将其拆分为{"友", "", "又"}

1个回答

12

文档所述

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


获取长度:

new System.Globalization.StringInfo("友又").LengthInTextElements

获取每个Unicode字符的方法在此处记录,但是使用扩展方法将更加方便:

public static IEnumerable<string> TextElements(this string s) {
    var en = System.Globalization.StringInfo.GetTextElementEnumerator(s);

    while (en.MoveNext())
    {
        yield return en.GetTextElement();
    }
}

可以在 foreach 循环或 LINQ 语句中使用它:

foreach (string segment in "友又".TextElements())
{
    Console.WriteLine(segment);
}

这也可以用于长度:

Console.WriteLine("友又".TextElements().Count());

太棒了。非常感谢。我应该使用 GetTextElementEnumerator 来分割字符串吗? - Clément
@Clément 是的,你需要,就像文档所述。 - GSerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接