2017-02-14 60 views
7

"123‍‍‍" gibi bir dizem varsa, onu ["", "1", "2", "3", "‍‍‍"] gibi görünen bir diziye nasıl bölebilirim? ToCharArray() kullanırsam, ilk Emoji 2 karaktere, ikincisi ise 7 karaktere ayrılır.Bir Unicode dizesini C# içindeki birden çok Unicode karakterine nasıl bölebilirim?

Güncelleme

çözüm şimdi şuna benzer:

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

yani yorumlarda belirtildiği gibi, bu aile emoji'ler için çalışmıyor unutmayınız. Sadece 2 karakter veya daha az olan emojiler için çalışır. Örneğin çıktısı: ["", "1", "2", "3", "‍", "‍", "‍", ""]

+1

'‍ + ‍ + ‍ + = ‍‍‍' komik, bilmiyordu – fubo

+1

Bu nasıl oldu? Emoji metin oluşturma motoru içindir. Emoji içeren metin işlemek, kabaca Çince metin işleme sevinci ile eşdeğerdir. Veya Zalgo, gerçek bir meydan okuma istiyorsanız :) Vekilleri tanıma roket bilimi değildir, Char.IsLowSurrogate() kullanın. –

cevap

5

.NET, dizeleri UTF-16 öğelerinin bir dizisi olarak gösterir. Temel Çok Dilli Düzlem (BMP) dışındaki unicode kod noktaları, yüksek ve düşük bir vekil olarak ayrılacaktır. Her bir alt 10 bit gerçek kod noktası değerinin yarısını oluşturur.

Bu vekilleri algılamak için yardımcılar vardır (örn. Char.IsLowSurrogate).

Bunu kendiniz yapmanız gerekir.

+0

Bu vekillerin nasıl çalıştığına dair bir dokümanınız veya bir gönderiiniz var mı? – mjw

+1

@mjw Bkz. Düzenleme (ve hatırlamak için beni soruları hatırlatan yorumcuya teşekkür ederim). – Richard