你可以通过排列/组合计算UTF 16编码代表1,112,064个数字吗?
答案 0 :(得分:5)
UNICODE标准第3.9节说:
每个编码形式将Unicode代码点U + 0000..U + D7FF和U + E000..U + 10FFFF映射到唯一代码单元序列。
因此,UTF-16可以表示的代码点数('字符')是
0xD7FF + 1 + (0x10FFFF - 0xE000) + 1 = 1 112 064
UNICODE标准通常为32位。但是,特定编码保留较少的位数来表示最常见的字符对它们可合法表示的实际字符数施加特定限制。为了允许更长的位序列,这反过来允许描述更长的8(UTF-8)或16(UTF-16)位代码点,定义了特殊的代理代码点。
此外,能够表示给定编码中的给定代码点并不意味着它是有效的 - 它必须首先由UNICODE标准分配和描述。因此,没有数学公式可以产生可以表示的字符数,而数字1 112 064并不一定意味着有1M个有效字符。
有关详细讨论,请参阅UNICODE标准的section 3.9。
答案 1 :(得分:4)
没有。 UTF-16表示的字符数只能通过规范来识别,而不能通过数学来识别。 UTF-16是一组特定的编码规则,不是某些公式的内在属性。
答案 2 :(得分:1)
请在此处查看答案https://stackoverflow.com/questions/280182/
它几乎和规格一样好,它结合了一些规格。我会引用:
UTF-16是一个可变长度代码;它的字符消耗2或4个字节。 0xD800-0xDFFF范围内的2字节值保留用于构造4字节字符,所有4字节字符由0xD800-0xDBFF范围内的两个字节组成,后跟0xDC00-0xDFFF范围内的2个字节。因此,Unicode不会分配U + D800-U + DFFF范围内的任何字符。
UTF-16的容量:1,112,064
答案 3 :(得分:1)
您可以用UTF-16表示1112064标量值,因为标准的3.9节中定义D76定义了1112064个标量值,并且因为UTF-16编码形式(与所有Unicode编码形式一样)是唯一的表示形式所有Unicode标量值的定义,如定义D79中所定义。
D76 - Unicode标量值:除高代理和低代理代码点之外的任何Unicode代码点。
- 作为此定义的结果,Unicode标量值的集合包括范围0到D7FF和E000到10FFFF(包括0和FFF)。
D79 - Unicode编码格式将每个Unicode标量值分配给唯一的代码单元序列。
当然,由于定义D91中列出的代理对编码的机制,这些数字并不完全是任意的。鉴于表3-5中的位分布,没有办法将标量值编码为高于10FFFF。
答案 4 :(得分:1)
有三种UTF-16代码单元:
1024×1024 = 1,048,576可通过代理人表示(“补充字符”U + 10000到U + 10FFFF)。在BMP中添加63,488个可表示的字符,即可得到1,112,064。