为了解决ASCII码的不足
<1> 什么是UNICODE?
这是一个编码方案,说白了就是一张包含全世界所有文字的一个编码表,只要这个世界上存在的文字符号,统统给你一个唯一的编码: Unicode编码范围是:0-0x10FFFF,可以容纳100多万个符号!
<2> UNICODE的问题:
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
UNICODE只解决了编码,不管怎么存储,而UTF-16/UTF-8才决定了在计算机中如何存储。
UTF-16编码以16位无符号整数为单位,注意是16位为一个单位,不表示一个字符就只有16位。这个要看字符的unicode编码处于什么范围而定,有可能是2个字节,也可能是4个字节现在机器上的unicode编码一般指的就是UTF-16。
Unicode没有约定怎么存储,只有UTF-16 / UTF-8才约定了如何存储,如果存储时没有UTF-16 / UTF-8 只有Unicode那么默认使用UTF-16存储
cUTF-16 假设 中: 0x12 34 国: 0x 00 01 23 34 所以 如果碰到一个特别的字符,两个字节放不下时,会占用四个字节,为什么是四个字节,而不是三个字节呢? 因为UTF-16默认一个存储单元是两个字节,一个存储单元存不下就要使用两个存储单元,也就是四个字节了 两个字节为一个单位
UTF-16的优点:
计算的时候,拆分时,解析时,非常简单,两个字节一个单位一刀一刀砍
UTF-16的弊端:
0-10FFFF,浪费存储空间,A一个字节就可以存储,UTF-16的话需要字节对齐,也就是2个字节,因此UTF-8出现
可变长存储方案
存储根据字符大小来分配,如A就分配一个字节,中就分配两个字节
优点:节省方案,方便解析位各种类型,根据文字编码范围
c//编码范围 Unicode编码(16进制) ║ UTF-8 字节流(二进制) 000000 - 00007F ║ 0xxxxxxx 000080 - 0007FF ║ 110xxxxx 10xxxxxx 000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx 010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 如中文的 中 字 E4 B8 AD //因为1110xxxx 10xxxxxx 10xxxxxx是固定的,所以只需要提取x的部分 1110 (0100) 10(11 1000) 10(10 1101) 0100 1110 0010 1101 4 E 2 D
即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型
cUTF-8 ║ EF BB BF UTF-16LE ║ FF FE UTF-16BE ║ FE FF
本文作者:Na1r
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!