我有以下字符串:
友又
相应的UTF-16表示(little-endian)是
CB 53 40 D8 87 DC C8 53
\___/ \_________/ \___/
友 又
"友又".Length
返回4,因为CLR将字符串存储为4个2字节字符。
如何测量字符串的长度?如何将其拆分为{ "友", "", "又" }
?
答案 0 :(得分:12)
作为documented:
Length
属性返回此实例中Char
个对象的数量,而不是Unicode字符数。原因是Unicode字符可能由多个Char
表示。使用System.Globalization.StringInfo
类来处理每个Unicode字符而不是每个Char。
获取长度:
new System.Globalization.StringInfo("友又").LengthInTextElements
获取每个Unicode字符为documented here,但制作扩展方法更方便:
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());