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

时间:2015-07-07 14:49:43

标签: c# windows-runtime windows-phone-8.1

我正尝试从此字符串""开始创建一个包含表情符号"D83DDC71"的字符串。为此,我尝试在此字符串"\uD83D\uDC71"中转换上面的字符串。

如果我使用此代码,它可以正常工作(文本框按预期显示):

textbox.Text += "\uD83D\uDC71";

但是,如果我使用它,它不起作用(文本框显示确切的文本" \ uD83D \ uDC71"而不是单个字符):

textbox.Text += sender.Code.ToString("X").insert(4, @"\u").insert(0, @"\u");

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

3 个答案:

答案 0 :(得分:4)

好。看来你有一个字符串,它给出了字符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

答案 1 :(得分:3)

你有一个包含两个十六进制短路的字符串,所以你需要先解析它们。我的示例使用overload of 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 character escape sequences字符串文字。编译程序时,编译器会使用正确的unicode字节替换这些转义序列。这就是为什么你不能在执行期间在角色前添加\u以使其工作。

答案 2 :(得分: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除以4分成字符串数组。然后它会将每个字符串转换为char。最后它会将所有字符加入一个字符串作为表情符号。全部在一行。