如何在C#中将Unicode字符串拆分为多个Unicode字符?

问题描述:

如果我有一个像"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()。 –

.NET将字符串表示为一系列UTF-16元素。基本多语言平面(BMP)之外的Unicode代码点将被拆分为高位和低位代理。每个的低10位形成实际码点值的一半。

有助手可以检测到这些替代品(例如Char.IsLowSurrogate)。

你需要自己处理。

+0

你有关于这些代理功能如何工作的文档或文章吗? – mjw

+1

@mjw请参阅编辑(并感谢评论者关于保存我记忆的问题)。 – Richard