读取 UTF-16 字节流以确定一个字符占用多少字节的规则是什么?我已经阅读了这些标准,但是根据对现实世界 UTF-16 编码流的经验观察,似乎有些地方标准不适用(或者我缺少标准的某个方面) .
从阅读 UTF-16 标准https://www.rfc-editor.org/rfc/rfc2781:
前 2 个字节的值 | 结果字符长度(字节) |
---|---|
0x0000-0xC7FF |
2 |
0xD800-0xDBFF |
4 |
0xDC00-0xDFFF |
无效序列 (RFC2781 2.2.2) |
0xDFFF-0xFFFF |
4 |
在实践中,这似乎是正确的,至少在某些情况下是这样。使用临时 SQL 脚本(SQL Server 2019;UTF-16 排序规则),但也使用在线解码器进行了验证:
特点 | 统一码名称 | ISO 10646 | UTF-16 编码(十六进制,大端) | 大小(字节) |
---|---|---|---|---|
一个 | 拉丁文大写字母 A | U+0041 | 00 41 |
2 |
Б | 西里尔大写字母 BE | U+0411 | 04 11 |
2 |
ァ</td> | 片假名字母小 A | U+30A1 | 30 A1 |
2 |
兔脸 | U+1F430 | D8 3D DC 30 |
4 |
但是,当将以下 ISO 10646 字符编码为 UTF-16 时,它似乎是 4 个字节,但读取前 2 个字节似乎并没有表明它会这么长:
特点 | 统一码名称 | UTF-16 编码(十六进制,大端) | 大小(字节) |
---|---|---|---|
⚕️ | 埃斯库拉皮乌斯的工作人员 | 26 95 FE 0F |
4 |
虽然我宁愿让我的问题与软件无关;以下 SQL 将使用默认排序规则和默认语言在 Microsoft SQL Server 2019 上重现此行为。(注意 SQL Server 是小端的)。
select cast(N'⚕️' as varbinary);
----------
0x95260FFE
很简单,您如何/为什么阅读0x2695
并认为“我需要阅读这个角色的下一个单词。”?为什么这似乎与已发布的 UTF-16 标准不一致?