2017-02-14 1 views
7

Wenn ich eine Zeichenfolge wie "123‍‍‍" habe, wie kann ich es in ein Array teilen, das wie ["", "1", "2", "3", "‍‍‍"] aussehen würde? Wenn ich ToCharArray() verwende, wird das erste Emoji in 2 Zeichen und das zweite in 7 Zeichen aufgeteilt.Wie kann ich eine Unicode-Zeichenfolge in C# in mehrere Unicode-Zeichen aufteilen?

aktualisieren

Die Lösung sieht nun wie folgt aus:

public static List<string> GetCharacters(string text) 
{ 
    char[] ca = text.ToCharArray(); 
    List<string> characters = new List<string>(); 
    for (int i = 0; i < ca.Length; i++) 
    { 
     char c = ca[i]; 
     if (c > 65000) continue; 
     if (char.IsHighSurrogate(c)) 
     { 
      i++; 
      characters.Add(new string(new[] { c, ca[i] })); 
     } 
     else 
      characters.Add(new string(new[] { c })); 
    } 
    return characters; 
} 

dass Bitte beachten Sie, wie in den Kommentaren erwähnt, ist es nicht für die Familie Emoji arbeiten. Es funktioniert nur für Emojis, die 2 Zeichen oder weniger haben. Die Ausgabe des Beispiels wäre: ["", "1", "2", "3", "‍", "‍", "‍", ""]

+1

'+ + + =' lustig, wusste nicht, dass – fubo

+1

Wie ist das passiert? Emoji ist für die Text-Rendering-Engine. Die Verarbeitung von Text, der Emoji enthält, entspricht in etwa der Freude, chinesischen Text zu verarbeiten. Oder Zalgo, wenn du eine echte Herausforderung haben willst :) Das Erkennen von Surrogaten ist keine Hexerei, verwende Char.IsLowSurrogate(). –

Antwort

5

.NET stellt Zeichenfolgen als eine Sequenz von UTF-16-Elementen dar. Unicode-Codepunkte außerhalb der Base Multilingual Plane (BMP) werden in einen High- und Low-Surrogat aufgeteilt. Die unteren 10 Bits von jedem bilden die Hälfte des realen Codepunktwertes.

Es gibt Helfer, die diese Surrogate erkennen (zB Char.IsLowSurrogate).

Sie müssen selbst damit umgehen.

+0

Haben Sie eine Dokumentation oder einen Beitrag darüber, wie diese Ersatzfunktionen funktionieren? – mjw

+1

@mjw Siehe bearbeiten (und danke an den Kommentator für die Frage zum Speichern meiner Erinnerung). – Richard

Verwandte Themen