为什么表情符号表情符号和表情符号标志的UTF-16字节一起看起来不同于它们各自UTF-16字节的序列



以下来自Visual Studio的C#交互式编译器:

> BitConverter.ToString(Encoding.BigEndianUnicode.GetBytes("😀"))
"D8-3D-DE-00"
> BitConverter.ToString(Encoding.BigEndianUnicode.GetBytes("🏴"))
"D8-3C-DF-F4"
> BitConverter.ToString(Encoding.BigEndianUnicode.GetBytes("😀🏴󠁧󠁢󠁥󠁮󠁧󠁿"))
"D8-3D-DE-00-D8-3C-DF-F4-DB-40-DC-67-DB-40-DC-62-DB-40-DC-65-DB-40-DC-6E-DB-40-DC-67-DB-40-DC-7F"

表情符号表情符号的代码单元是预期的代理对-";D8-3D-DE-00";

表情符号标志的代码单元是预期的代理对-";D8-3C-DF-F4";

既然如此,表情符号表情后面跟着表情符号标志的代码单位不应该是-";D8-3D-DE-00-D8-3C-DF-F4";?

后者不是简单的黑色标志表情符号,而是表情符号标记序列:

🏴󠁧󠁢󠁥󠁮󠁧󠁿旗帜:英格兰

表情符号的意思是:英国的国旗,英国的一个国家。可以显示为字母gbeng

旗帜:英格兰表情符号是一个标签序列组合🏴黑旗,󠁧标记拉丁文小写字母G,󠁢标记拉丁文小写字母B,󠁥标记拉丁文小写字母E,󠁮标记拉丁文小写字母N,󠁧标记拉丁文小写字母G和󠁿取消标记。这些显示为支持的单个表情符号平台。

标志:英格兰于2017年加入表情符号5.0。

我以前编写过PowerShellcmdletGet-CharInfo,下面是字符串的结果(列CodePoint包含Unicode(U+hhhh(和UTF-8字节,列Description包含代理项对(如果有的话(:

"😀🏴󠁧󠁢󠁥󠁮󠁧󠁿"      | Get-CharInfo
Char CodePoint                      Category Description
---- ---------                      -------- -----------
😀   {U+1F600, 0xF0,0x9F,0x98,0x80} So       GRINNING FACE (0xd83d,0xde00)
🏴   {U+1F3F4, 0xF0,0x9F,0x8F,0xB4} So       WAVING BLACK FLAG (0xd83c,0xdff4)
󠁧   {U+E0067, 0xF3,0xA0,0x81,0xA7} Cf       TAG LATIN SMALL LETTER G (0xdb40,0xdc67)
󠁢   {U+E0062, 0xF3,0xA0,0x81,0xA2} Cf       TAG LATIN SMALL LETTER B (0xdb40,0xdc62)
󠁥   {U+E0065, 0xF3,0xA0,0x81,0xA5} Cf       TAG LATIN SMALL LETTER E (0xdb40,0xdc65)
󠁮   {U+E006E, 0xF3,0xA0,0x81,0xAE} Cf       TAG LATIN SMALL LETTER N (0xdb40,0xdc6e)
󠁧   {U+E0067, 0xF3,0xA0,0x81,0xA7} Cf       TAG LATIN SMALL LETTER G (0xdb40,0xdc67)
󠁿   {U+E007F, 0xF3,0xA0,0x81,0xBF} Cf       CANCEL TAG (0xdb40,0xdc7f)

最新更新