如何将表情符号转换为其UTF-32/转义Unicode格式?

12
我正在开发一个WPF聊天应用程序,想在其中使用表情符号。我正在开发WPF应用程序。我想读取来自Android/iOS设备的表情符号,并显示相应的图像。
在WPF中,我得到了一个看起来像这样的黑色表情符号this。我不知道如何获取一组表情符号图标,这些图标以它们各自的十六进制/转义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的形式存在,而不是像你所说的图像或其他形式! - Rand Random
Char.ConvertFromUtf32(0x1F642) 将为您提供UTF-16表示/正确的C# Unicode字符串。 - ckuri
@RandRandom 实际上,该应用程序是跨平台的,因此它会接收来自 Android 和 iOS 设备的表情符号,我希望在 WPF 客户端中检测到它们。 - Joker_37
是的,我明白了你说的那部分内容,但我认为你没有理解我的意思。你的问题是“如何将表情符号转换为其UTF-32 / 转义Unicode”,而我告诉你,我不相信你以除UTF-32 / 转义Unicode方式之外的任何其他方式接收来自Android / iOS的聊天消息。我猜想你已经接收到类似于“Hello dear. I hope wont fail the test. \u1F642”这样的内容,所以我的问题是,如果是这种情况,为什么你需要/想要将其转换为字节数组,然后再转换为字符串,当你一开始就拥有你所要求的东西时... - Rand Random
2
@RandRandom 不,我在我的问题中分享了一张笑脸的图片。我以那种格式接收这些表情符号。在WPF中,它被转换为代表笑脸的符号,请参考我分享的图片。所以问题是,我在WPF中得到了一个存在于'Segoe UI Emoji'字体系列中的符号,而没有得到UTF-32代码。所以我想知道是否有任何方法可以将这些符号转换为UTF-32 /转义Unicode? - Joker_37
4个回答

20

您的转义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/zh-cn/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[])代替for循环。详情请参见https://msdn.microsoft.com/en-us/library/3a733s97(v=vs.110).aspx。这时的结果如下:

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

7
这是一个很好的回答,但让我困惑的一点是\uD83D\uDE42从哪里来的。为了让其他人理解清楚,这些被称为“代理对”。你可以在这里找到更多信息:https://unicodebook.readthedocs.io/unicode_encodings.html。它本质上是将UTF-32转换为两个UTF-16值的结果。可以在这里找到一个简单的转换工具:http://trigeminal.fmsinc.com/16to32AndBack.asp - Jason Rae

1

1

由于 C# 源文件可以包含 UTF-32 字符串文字,因此在此任务中没有必要使用任何编码。


示例 1。

var rgch = "\U0001F642".ToCharArray();
var str = $"\\u{(ushort)rgch[0]:X4}\\u{(ushort)rgch[1]:X4}";

结果:"\uD83D\uDE42" 字符串str的长度为12个UTF-16代码点(24字节)



例子2。

var rgch = "\U0001F642".ToCharArray();
var str = rgch[0] + "" + rgch[1];

结果: ""             字符串 str 的长度为 2 个 UTF-16 编码点(4 字节)



0
您可以简单地使用 @using System.Web 进行编码。
var columndata = "CSR story with emoji "`
columndata   = HttpUtility.UrlEncode(columndata);

它将对文本和表情进行编码。
这里我有带有HTML标签的文本,所以在解码时我使用了Trim()进行解码。
string titleRaw = HttpUtility.UrlDecode(@Model.columnNamne.ToString().Trim());

如果不存储在HTML标签中,则:
string titleRaw = HttpUtility.UrlDecode(@Model.columnNamne.ToString());

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