【问题标题】:convert a hex string to corresponding emoji string将十六进制字符串转换为相应的表情符号字符串
【发布时间】:2015-09-25 03:27:44
【问题描述】:

我正在尝试从这个字符串"D83DDC71" 开始创建一个带有表情符号"????" 的字符串。为此,我试图将上面的字符串转换为这个字符串"\uD83D\uDC71"

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

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

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

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

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

【问题讨论】:

  • 问题是如果我把这个 "\uD83D\uDC71" 放到文本框中它就可以工作,但是如果我将 \u 附加到这个字符串 "D83DDC71" 我只会得到一个字符串而不是一个表情符号
  • windowsphone的标准配置
  • 你想输出“金发的人”???? ?
  • 您可以将字符串拆分为 4 个字符块并使用“\u”分隔符重新加入它们。请参阅此处拆分为 chnaks:stackoverflow.com/questions/1450774/… 和此处加入 msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspx
  • 一般的表情符号,但在这种情况下是的

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


【解决方案1】:

好的。您似乎有一个字符串,它给出了字符 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

【讨论】:

    【解决方案2】:

    你有一个包含两个十六进制形式的短字符串,所以你需要先解析它们。我的示例使用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 以使其工作。

    【讨论】:

      【解决方案3】:

      试试这个

              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 x 4 分成字符串数组。然后它将每个字符串转换为char。最后,它将所有字符连接成一个字符串作为表情符号。都在一条线上。

      【讨论】:

      • @"\u" + m.Value 应该做什么?
      • ex : m.Value 将是 "D83D"。那么它将是"\uD83D"@AlexeiLevenkov
      • 你看到这个问题了吗?这基本上是“为什么"\uD83D\uDC71" 产生表情符号而@"\u"+ "d83d" + @"\" + "DC71" 没有”......所以不确定你的帖子如何回答它。另外\d 不会匹配字母,但这没那么有趣。
      • 不,它将是@"\uD83D",您需要"\uD83D"。但它甚至不会是因为您将 "" 而不是 str 传递给正则表达式匹配。正则表达式也在寻找十进制数字,而不是十六进制数字。
      • @JonHanna 打错了。我试试这个。也许我需要将 m.Value 转换为 unicode char。但我认为这可能有效
      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 2013-03-22
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2015-02-18
      相关资源
      最近更新 更多