表情符号代码(在C++中)"/>
html 表情转换,转换UTF16中的“HTML实体”表情符号代码(在C++中)
例如,unicode字符0x3DD8 0x00DE在文本中发现将被替换通过笑脸图像
字符U + 1F600笑脸由UTF-16代码单元序列0xD83D,0xDE00表示。
(Graphemica交换用于每个码单元中的字节的顺序是超级误导;忽略。)
我发现,这些代码是另一个标准的一部分,并且实际上是一个命名的一组项的“HTML实体”,显然用于网络开发
HTML与它无关。它们是普通的Unicode字符,只是在U + FFFF之上的基本多语言平面以外的字符,这就是为什么它需要多个UTF-16代码单元来表示它们。
HTML数字字符引用(如😀)(通常不正确地称为实体)是通过代码点编号引用字符的一种方式,但转义字符串仅在HTML(或XML)文档中有效,而我们不在其中之一。
所以:
我需要的0x1f600 HTML实体代码转换为0x3DD8 0x00DE UTF16代码。
听起来更像:
我需要转换U + 1F600笑嘻嘻工作面的表示:从所述码点数目0x1F600为UTF-16编码单元序列0xD83D,0xDE00
其中在C#将是:
或在另一个方向:
int codepoint = Char.ConvertToUtf32("\uD83D\uDE00", 0); // 0x1F619
('UTF-32'这个名字在这里的选择很差;我们正在谈论一个整数代码点数,而不是每个字符四字节的序列。)
或者是否有一个已知的技巧来做到这一点? (例如“字符+('a' - 'A')”将大写字符转换为较低)
在C++中,事情更令人讨厌;没有(我能想到的)任何直接在代码点和UTF-16代码单元之间转换的东西。您可以使用各种编码函数/库在UTF-32编码的字节序列和UTF-16编码单元之间进行转换,但最终可能比您自己编写conversion logic更加虚拟。例如在用于单个字符最基本的形式:
std::wstring fromCodePoint(int codePoint) {
if (codePoint < 0x10000) {
return std::wstring(1, (wchar_t)codePoint);
}
wchar_t codeUnits[2] = {
0xD800 + ((codePoint - 0x10000) >> 10),
0xDC00 + ((codePoint - 0x10000) & 0x3FF)
};
return std::wstring(codeUnits, 2);
}
这是假设该wchar_t类型基于UTF-16代码单元,相同的C#string类型是什么。在Windows上,这可能是真的。在其他地方,它可能不是,但在wchar_t基于代码点的平台上,您可以将每个代码点作为字符从字符串中提取出来,而无需进一步处理。
(优化和错误处理作为练习留给读者。)
更多推荐
html 表情转换,转换UTF16中的“HTML实体”表情符号代码(在C++中)
发布评论