emoticon unicode格式字符串转换为单个字符emoticon字符串



我正在尝试将包含表示表情符号Unicode格式的字符串的String对象转换为具有Unicode表示的相同表情符号作为其唯一字符的String,例如将"u1F34E"转换为🍎

假设字符串的转义序列将被正确处理,我尝试了以下操作:

String str = "u1F34E";
Console.WriteLine("'{0}' to '{1}'", str, str.ToCharArray()[0]);

输出:

'u1F34E' to ''

将字符串直接输出到文本文件会产生相同的结果,因此我使用的不仅仅是调试器。我不知道该怎么办。如有任何帮助,我将不胜感激。

编辑:

我意识到我最初的问题不清楚;我的意图是在字符串中有一个正确格式化的UTF-16字符串和一个UTF-32 unicode,因为我要发送这个值的API需要这种格式。我已经成功解决了以下问题:

String str = "1F34E"; //removed u with prior parsing
int unicode_utf32 = int.Parse(stdemote.Unicode, System.Globalization.NumberStyles.HexNumber);
String unicode_utf16_str = Char.ConvertFromUtf32(unicode_utf32);
Console.WriteLine("'{0}' to '{1}'", str, unicode_utf16_str);

事实并非如此

string str = "u1F34E";

。Net使用UTF-16对其字符串进行编码。这意味着两个字节(16位)用于表示一个Unicode码点。这反过来使Unicodeu转义序列实际上是U+0000U+FFFF(16位)或扩展版本U+00000000U+FFFFFFFF(32位)

表情符号🍎,使用高码点0001F34E,因此需要将其编码为代理对,两个UTF-16字符"uD83CuDF4E"或组合为
"U0001F34E"1

string str = "uD83CuDF4E";
// or
string str = "U0001F34E"

如果您的目标是将实际的文本元素与字符分开,您可以使用StringInfo.GetTextElementEnumerator

public static IEnumerable<string> ToElements(string source)
{
var enumerator = StringInfo.GetTextElementEnumerator(source);
while (enumerator.MoveNext())
yield return enumerator.GetTextElement();
}

<子>注意:我对术语的使用可能不是最常用或最准确的,如果你认为可以加强,请随时编辑


1感谢Mark Tolonen指出Unicode转义序列实际上支持16位和32位变体uXXXXUXXXXXXXX,更多信息可以在Jon Skeet Strings在c#和。net中的博客文章中找到

最新更新