2017-02-14 15 views
7

Jeśli mam ciąg znaków taki jak "123‍‍‍", jak mogę podzielić go na tablicę, która będzie wyglądać jak ["", "1", "2", "3", "‍‍‍"]? Jeśli używam ToCharArray(), pierwszy emotikon jest podzielony na 2 znaki, a drugi na 7 znaków.Jak podzielić ciąg znaków Unicode na wiele znaków Unicode w języku C#?

Aktualizacja

Rozwiązanie teraz wygląda tak:

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; 
} 

Należy pamiętać, że, jak wspomniano w komentarzach, to nie działa dla emotikonom rodziny. Działa tylko w przypadku emotikonów, które mają 2 znaki lub mniej. Dane wyjściowe tego przykładu będą następujące: ["", "1", "2", "3", "‍", "‍", "‍", ""]

+1

'+ + + =' zabawny, nie wiedziałem, że – fubo

+1

Jak to się stało? Emoji jest dla silnika renderującego tekst. Przetwarzanie tekstu zawierającego emoji jest mniej więcej równoznaczne z radością przetwarzania chińskiego tekstu. Lub Zalgo, jeśli chcesz prawdziwego wyzwania :) Rozpoznanie surogatów nie jest inaczej nauką o rakietach, użyj Char.IsLowSurrogate(). –

Odpowiedz

5

. NET reprezentuje ciągi jako sekwencję elementów UTF-16. Punkty kodowe Unicode poza Bazową płaszczyzną wielojęzyczną (BMP) zostaną podzielone na wysoki i niski odpowiednik. Niższe 10 bitów każdej z nich tworzy połowę rzeczywistej wartości punktu kodowego.

Istnieją pomocnicy do wykrywania tych surogatów (np. Char.IsLowSurrogate).

Musisz sobie z tym poradzić.

+0

Czy masz dokumentację lub wpis dotyczący działania tych zastępczych funkcji? – mjw

+1

@mjw Zobacz edit (i dziękuję komentatorowi na pytanie o zapisanie mnie pamiętając). – Richard

Powiązane problemy