2013-01-02 14 views
7

I mają następujące wyrażenie:pomiaru długości łańcucha zawierającego szerokości znaków

友又 

Odpowiednie UTF-16 reprezentacji (mało endiany) jest

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

"友又".Length powraca 4, ponieważ ciąg jest przechowywany jako 4 2-bajtowe znaki przez CLR.

Jak zmierzyć długość mojego sznurka? Jak podzielić go na { "友", "", "又" }?

Odpowiedz

11

Jak documented:

Length Właściwość zwraca liczbę Char obiektów w tym przypadku nie liczbę znaków Unicode. Powodem jest to, że znak Unicode może być reprezentowany przez więcej niż jeden Char. Użyj klasy System.Globalization.StringInfo, aby pracować z każdą z znaków Unicode zamiast z każdym Char.


długość Pierwsze:

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

Pierwsze każdy znak Unicode jest documented here, ale jest to o wiele bardziej wygodne, aby metodę rozszerzenia:

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

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

i używać go w foreach lub w LINQ Oświadczenie:

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

które również mogą zostać wykorzystane do długości:

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

To niesamowite. Wielkie dzięki. Czy użyłbym 'GetTextElementEnumerator' do podziału ciągu? –

+0

@ Clément Tak, byłbyś, jako [udokumentowany] (http://msdn.microsoft.com/en-us/library/x2f3k4f6.aspx). – GSerg

+0

Jeszcze raz dziękuję za pomoc. –