2017-02-14 127 views
7

如果我有一個像"123‍‍‍"這樣的字符串,我怎麼能把它分成一個數組,看起來像["", "1", "2", "3", "‍‍‍"]?如果我使用ToCharArray(),則第一張表情符號被分成2個字符,第二個表情符號分成7個字符。如何在C#中將Unicode字符串拆分爲多個Unicode字符?

更新

的解決方案現在看起來是這樣的:

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

請注意,由於在評論中提到的,它並沒有爲家庭表情符號工作。它只適用於2個字符或更少的表情符號。示例的輸出爲:["", "1", "2", "3", "‍", "‍", "‍", ""]

+1

'+ + + ='好笑,不知道 – fubo

+1

這是怎麼發生的?表情符號用於文本渲染引擎。處理包含表情符號的文本大致相當於處理中文文本的樂趣。或Zalgo,如果你想要一個真正的挑戰:)認識到代用品不是其他火箭科學,使用Char.IsLowSurrogate()。 –

回答

5

.NET將字符串表示爲一系列UTF-16元素。基本多語言平面(BMP)之外的Unicode代碼點將被拆分爲高位和低位代理。每個的低10位形成實際碼點值的一半。

有助手可以檢測到這些替代品(例如Char.IsLowSurrogate)。

你需要自己處理。

+0

你有關於這些代理功能如何工作的文檔或文章嗎? – mjw

+1

@mjw請參閱編輯(並感謝評論者關於保存我記憶的問題)。 – Richard