将十六进制字符串转换为相应的表情符号字符串

4
我正在尝试创建一个以表情符号""开头的字符串,起始于这个字符串"D83DDC71"。为了达到这个目的,我试图将上述字符串转换为这个字符串"\uD83D\uDC71"
如果我使用以下代码,它可以正常工作(文本框显示如预期):
textbox.Text += "\uD83D\uDC71";

但是如果我使用这个方法,它不起作用(文本框显示精确文本“\uD83D\uDC71”,而不是单个字符):
textbox.Text += sender.Code.ToString("X").insert(4, @"\u").insert(0, @"\u");

什么是将十六进制表达的emoji转换为相应的C#字符串(UTF-16)的正确方法?

问题在于,如果我将"\uD83D\uDC71"放入文本框中,它可以正常工作,但是如果我将\u附加到该字符串"D83DDC71"中,我只会得到一个字符串而不是表情符号。 - frenk91
Windows Phone 的标准。 - frenk91
你是想输出“金发的人”吗? - Jon Hanna
你可以将字符串分割成4个字符的块,然后用"\u"分隔符重新连接它们。请参见此处以将其拆分为块:https://dev59.com/0HM_5IYBdhLWcg3wRw11,以及此处以进行连接:https://msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspx - PaulF
表情符号通常很常见,但在这种情况下是的。 - frenk91
3个回答

6

好的。看起来你有一个字符串,其中给出了字符U+1F471()的每个UTF-16代码单元的十六进制。

由于char表示UTF-16代码单元,因此将字符串拆分为两个4个字符的块,将其解析为十六进制的int,将每个块转换为char,然后将它们组合成一个字符串:

var personWithBlondHair = ""
  + (char)int.Parse("D83DDC71".Substring(0, 4), NumberStyles.HexNumber)
  + (char)int.Parse("D83DDC71".Substring(4, 4), NumberStyles.HexNumber);

根据https://dotnetfiddle.net/oTgXfG的内容,涉及IT技术相关内容。

3
你有一个包含两个十六进制短整型的字符串,因此需要先解析它们。我的示例使用了Convert.ToInt16方法的重载, 它还接受一个整数参数来指定字符串中整数的进制,而在我们的情况下是16(十六进制)。
string ParseUnicodeHex(string hex)
{
    var sb = new StringBuilder();
    for (int i = 0; i < hex.Length; i+=4)
    {
        string temp = hex.Substring(i, 4);
        char character = (char)Convert.ToInt16(temp, 16);
        sb.Append(character);
    }
    return sb.ToString();
}

请注意,如果字符串的长度不能被4整除,则此方法将失败。
这个方法之所以有效,是因为:
textbox.Text += "\uD83D\uDC71";

这是因为您有一个包含 Unicode字符转义序列字符串字面量。当您编译程序时,编译器会将这些转义序列替换为正确的Unicode字节。这就是为什么您不能在执行过程中只添加\u来使其正常工作的原因。

0

试试这个

        string str = "D83DDC71";
        string emoji = string.Join("", (from Match m in Regex.Matches(str, @"\S{4}")
            select (char) int.Parse(m.Value, NumberStyles.HexNumber)).ToArray());

这将把您的字符串每4个字符分割成一个字符串数组。然后它将把每个字符串转换为字符。最后,它将所有字符连接成一个表情符号字符串,全部在一行中完成。


@"\u" + m.Value 是什么意思? - Alexei Levenkov
你看过这个问题吗?基本上是“为什么 "\uD83D\uDC71" 会产生表情符号而 @"\u"+ "d83d" + @"\" + "DC71" 不会”... 所以不确定你的帖子如何回答这个问题。另外,\d 不匹配字母,但那不是很有趣。 - Alexei Levenkov
不,它将是 @"\uD83D",而你需要 "\uD83D"。但这甚至也不会发生,因为你正在将 "" 而不是 str 传递给正则表达式匹配。此外,正则表达式正在寻找十进制数字,而不是十六进制数字。 - Jon Hanna
@JonHanna 那是打错了。我试试这个。也许我需要将 m.Value 转换为 Unicode 字符。但我认为这可能会起作用。 - M.kazem Akhgary
是的,应该是\S。我已经修复了它。不过我使用了你的算法将其转换为字符。@JonHanna - M.kazem Akhgary
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接