【问题标题】:How to convert emoticons to its UTF-32/escaped unicode?如何将表情符号转换为其 UTF-32/转义 unicode?
【发布时间】:2017-11-27 11:09:42
【问题描述】:

我正在开发 WPF 中的聊天应用程序,我想在其中使用表情符号。我正在开发 WPF 应用程序。我想阅读来自 Android/iOS 设备的表情符号并显示相应的图像。

在 WPF 上,我得到一个黑色表情符号,看起来像 。我不知何故得到了一个表情符号图标库,这些图标用相应的十六进制/转义的 unicode 值保存。 所以,我想把这些表情符号转换成UTF-32/转义的unicode,这样我就可以直接用它们替换相关的表情符号了。

我曾尝试将表情符号转换为其 unicode,但最终得到一个不同的字符串,其中包含几个符号,它们具有不同的 unicode。

string unicodeString = "\u1F642";  // represents ???? 

Encoding unicode = Encoding.Unicode;
byte[] unicodeBytes = unicode.GetBytes(unicodeString);

char[] unicodeChars = new char[unicode.GetCharCount(unicodeBytes, 0, unicodeBytes.Length)];
unicode.GetChars(unicodeBytes, 0, unicodeBytes.Length, unicodeChars, 0);
string asciiString = new string(unicodeChars);

感谢任何帮助!

【问题讨论】:

  • “来自 Android/iOS 设备的表情符号”是什么意思?我绝对认为你会在 unicode 中得到它们,而不是作为图像或你在说什么?!?
  • Char.ConvertFromUtf32(0x1F642) 将为您提供 UTF-16 表示/正确的 C# Unicode 字符串
  • @RandRandom 实际上该应用程序是跨平台的,因此它从 Android 和 iOS 设备接收表情符号,我想在 WPF 客户端中检测到。
  • 是的,得到了​​那部分,但我相信你没有得到我。您的问题是“如何将表情符号转换为其 UTF-32/转义 unicode”,我告诉您,除了 UTF-32/转义 unicode 方式之外,我不相信您会以任何其他方式从 Android/iOS 接收聊天消息。我的猜测是你已经收到类似“你好,亲爱的。我希望不会通过测试。\u1F642”所以我的问题是,如果是这种情况,你为什么需要/想要将其转换为字节数组而不是再次转换为字符串,当你拥有你想要的东西时......
  • @RandRandom 不,我在我的问题中分割了一张微笑的图像。我收到了那种格式的表情符号。在 WPF 中,它被转换为代表微笑的符号,请参考我的问题,我在哪里分割图像。所以问题是我得到了一个符号,它出现在 WPF 的“Segoe UI Emoji”字体系列中,而没有得到 UTF-32 代码。所以我想知道有什么办法可以将这些符号转换为 UTF-32 /escape unicode ?

标签: c# wpf unicode emoji emoticons


【解决方案1】:

您转义的 Unicode 字符串在 C# 中无效。

string unicodeString = "\u1F642";  // represents ? 

这段代码不代表“略带微笑的脸”,因为 C# 只尊重前 4 个字符 - 代表 UTF-16(2 字节)。

所以你实际得到的是代表1F64 的字母,后跟一个简单的2http://www.fileformat.info/info/unicode/char/1f64/index.htm

所以这个:ὤ2

如果您想输入 4 字节的十六进制并获取您必须使用的相应字符串:

var unicodeString = char.ConvertFromUtf32(0x1F642);

https://msdn.microsoft.com/en-us/library/system.char.convertfromutf32(v=vs.110).aspx

或者你可以这样写:

\uD83D\uDE42

这个字符串可以像这样解析,以获得您想要的结果,这也是我们开始使用的十六进制值:

var x = char.ConvertFromUtf32(0x1F642);

var enc = new UTF32Encoding(true, false);
var bytes = enc.GetBytes(x);
var hex = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
    hex.AppendFormat("{0:x2}", bytes[i]);
}
var o = hex.ToString();
//result is 0001F642

(结果有前导零,因为 UTF-32 总是 4 字节)

你也可以使用 BitConverter.ToString(byte[]) https://msdn.microsoft.com/en-us/library/3a733s97(v=vs.110).aspx 来代替 for 循环,结果将如下所示:

var x = char.ConvertFromUtf32(0x1F642);

var enc = new UTF32Encoding(true, false);
var bytes = enc.GetBytes(x);
var o = BitConverter.ToString(bytes);
//result is 00-01-F6-42

【讨论】:

【解决方案2】:

请注意Encoding.Unicode 在 C# 中是 UTF-16。要读取 32 位 Unicode,有这个 Encoding.UTF32Link on MSDN for Encoding.​UT​F32

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 2018-07-19
    • 2015-10-18
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多