是因为UTF-16设计的这个代理对编码机制,将码元的有效位数从原来的16位,扩展到了20位(32位中减去两个代理定数前缀,也就是减去12位代理附加位,剩下的有效位数为20位),其中前4位刚好可以表示16个增补平面的编号之一(因为2^4=16),后16位刚好可以表示一个增补平面中的所有码点(因为2^16=65536)。
UTF-16也是一种变长编码,对于一个Unicode字符被编码成1至2个码元,每个码元为2个字节(16位)。UTF-16编码会有字节序的问题,所以根据大小端又分为大端UTF-16(UTF-16 BE)和小端UTF-16(UTF-16 LE)。 1. 基本平面(码点范围U+0000-U+FFFF) 在基本多语言平面内的码位UTF-16编码使用1个码元且其值与Unicode是...
UTF-16利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。在UTF-16中,从U+10000到U+10FFFF的码位被编码为一对16比特长的码元,称作代理对,具体方法是:码位减去0x10000,得到的值的范围为20比特长的0..0xFFFFF,写成二进制形式:yyyy yyxx xxxx xxxx。©...
于是 Unicode 与 ISO/IEC 10646 新标准规定 UTF-8 、UTF-16、UTF-32 三种编码。UTF-8 是兼容 ASCII ,UTF-32 是定长编码,而 UTF-16 则是为了向下兼容旧标准(UCS-2),重新规定成了一个既不兼容ASCII ,又是变长编码,还有字节序问题的垃圾方案。UTF-16 是一个历史性的错误,是应该被扫进历史垃圾堆的东西...
其它平面(叫做辅助平面,Supplementary Planes)中的码位,在UTF-16中被编码为一对16位长的码元(即32bit,4Bytes),称作代理对(surrogate pair),具体方法是:码位(0x10000~0x10FFFF)减去0x10000(BMP范围),剩下20比特长的数字,范围是0..0xFFFFF。高位的10比特(数值范围为0..0x03FF)被加上0xD800...
UTF-32 是固定长度的编码,始终占用 4 个字节,足以容纳所有的 Unicode 字符,所以直接存储 Unicode 码即可,不需要任何编码转换。虽然浪费了空间,但提高了效率。 UTF-8、UTF-16、UTF-32 之间如何转换 前面介绍过,UTF-8、UTF-16、UTF-32 是 Unicode 码表示成不同的二进制格式的编码规则,同样,通过这三种编码的二...
一、什么是编码,数据类型和编码有什么关系? 二、英文字符编码 ASCII编码 三、中文编码 1. GB2312标准 2. GBK编码 3. 其他中文编码 四、Unicode字符集 1. UTF-32 2. UTF-16 2. UTF-8 3. BOM 五、ANSI编码 前言 我们在开发中是不是经常会遇到这样的问题,比如你在VS2019中创建了一个工程,里面有C语言程...
UTF-16编码方式 1. UTF-16编码方式源于UCS-2(Universal Character Set coded in 2 octets、2-byte Universal Character Set)。而UCS-2,是早期遗留下来的历史产物。 UCS-2将字符编号直接映射为字符编码(CEF,而非CES,详见前文中对现代字符编码模型的解释),亦即字符编号就是字符编码,中间没有经过特别的编码算法转换...
对于Unicode 编号范围在 0 ~ FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储 Unicode 编号,不用进行编码转换,这跟 UTF-32 非常类似。 对于Unicode 编号范围在 10000~10FFFF 之间的字符,UTF-16 使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于 D800~DB...