2013-01-02 98 views
7

我有以下字符串:測量包含的字符串的長度寬字符

友又 

相應UTF-16表示(小端)是

CB 53 40 D8 87 DC C8 53 
\___/ \_________/ \___/ 
    友    又 

"友又".Length返回4,因爲字符串由CLR存儲爲4個2字節字符。

如何測量我的字符串的長度?我如何將它分成{ "友", "", "又" }

回答

11

由於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()); 
+0

這真棒。非常感謝。我會使用'GetTextElementEnumerator'來拆分字符串嗎? –

+0

@Clément是的,你會[記錄](http://msdn.microsoft.com/en-us/library/x2f3k4f6.aspx)。 – GSerg

+0

再次感謝您的幫助。 –