2013-01-02 9 views
7

ho la seguente stringa:misura la lunghezza della stringa contenente caratteri estesi

友又 

Il corrispondente UTF-16 rappresentazione (little endian) è

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

"友又".Length ritorni 4, perché la stringa è memorizzato come 4 caratteri a 2 byte dal CLR.

Come misurare la lunghezza della stringa? Come posso dividerlo in { "友", "", "又" }?

risposta

11

Come documented:

La proprietà Length restituisce il numero di oggetti Char in questo caso, non il numero di caratteri Unicode. Il motivo è che un carattere Unicode potrebbe essere rappresentato da più di uno Char. Utilizzare la classe System.Globalization.StringInfo per lavorare con ciascun carattere Unicode invece di ogni Char.


Ottenere lunghezza:

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

Ottenere ogni carattere Unicode è documented here, ma è molto più conveniente per fare un metodo di estensione:

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

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

e usarlo in un foreach o in un LINQ dichiarazione:

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

che può anche essere utilizzato per la lunghezza:

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

Questo è impressionante. Molte grazie. Dovrei usare 'GetTextElementEnumerator' per dividere la stringa? –

+0

@ Clément Sì, come [documentato] (http://msdn.microsoft.com/en-us/library/x2f3k4f6.aspx). – GSerg

+0

Grazie ancora per il tuo aiuto. –