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基于代码点的平台上,您可以将每个代码点作为字符从字符串中提取出来,而无需进一步处理。

(优化和错误处理作为练习留给读者。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值