表情符号unicode格式的字符串转换为单字符表情字符串

Conversion of String with emoticon unicode format to String with single character emoticon

我正在尝试将包含表示表情符号 Unicode 格式的字符串的 String 对象转换为 String,并且将 Unicode 表示的相同表情符号作为其唯一字符,例如将 "\u1F34E" 转换为 </code>.</p> <p>假设字符串的转义序列将被正确处理,我尝试了以下操作:</p> <pre><code>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 代码点。这反过来使 Unicode \u 转义序列实际上 U+0000U+FFFF (16 位)或扩展版本 U+00000000U+FFFFFFFF(32 位)

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

例子

string str = "\uD83C\uDF4E";
// 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 for pointing out that the Unicode escape sequence actually supports both 16bit and 32bit variants \uXXXX and \UXXXXXXXX more information can be found in a blog post by Jon Skeet Strings in C# and .NET