目录
字符的Unicode编码与存储实现(UTF-8、UTF-16、UTF-32)
1、Unicode编码
一套对字符的编码规则,通过一个编号可以查找到对应的字符。
2、Unicode码在计算机中的存储方式
2.1 UTF-32存储方式
用4个字节存储一个字符的编码信息。可直接将Unicode编码转化为二进制整数进行存储,使用简单方便。一般编码与编号存在一定的偏移量,比如编码0表示编号1,那么编码转编号需要加1。
2.2 UTF-8存储方式
在最高位用1的个数表示需要占用的字符数,其后紧跟一个0作为分隔,1010 0001表示占用1个字符,编码为10 0001。
2.3 UTF-16存储方式
一般用2个字节进行编码,总的编码量为2^16(约6万多),实际字符数量远多于这个数量级。大于2^16编码的处理方式:以4个字节进行编码,第一个字节的开头固定为1101 10yy,2字节编码方式中同样开头的编码没有安排对应的字符。第三个字节的开头固定为1101 11xx,2字节编码方式中同样开头的编码没有安排对应的字符。
3、字符编码方式的特点
UTF-32 编码解码规则简单,一般高位都为0,浪费了存储空间,对于英文字符前3个字节都是存的0。
UTF-8 编码灵活性搞,能够兼容各种文字的编解码,对于英文字符一般只占用一个字节,存储效率也高,英语国家对UTF-8的编码方式接受度很高。因为互联网的普及,不同的编码方式会导致乱码,目前普遍采用UTF-8进行编码。
UTF-16 编解码规则较为复杂,对于2个字节编码的符号,存储效率较高。
4、UTF-8与汉字编码
汉字的编码效率,如果不考虑兼容性,仅仅考虑编码的效率。常用汉字及英文用2个字节,即2^16可以全部包括。采用UTF-8的拜编码方式,许多汉字需要使用3个字节来编码,存储效率是降低的。
5、字符的边界与文件的随机读取
UTF-8编码的文件,在进行随机读写的时候,定位到某一个字节,往前查找最多3个字节,即可以确定字符的边界。
UTF-32编码的文件,进行随机读写,定位到某一个字节,需要知道当前总字节数除以4的余数,因为字节是有地址编号的,可以使用当前编号减去文件开头的字节编号,计算总的字节数,这样可以避免从文件头开始进行遍历计数。有了总的字节数便可以方便的确定字符的边界。
6、字符编码的容错性
UTF-8中3个字节的编码形式
110X XXXX 10XX XXXX 10XX XXXX
第二、三个字节采用10开头是为了容错性,假如第一个字节发生编码错误,造成信息缺失,后2个字节可以作为独立的单元进行处理,这样仅仅3个字节处理错误,不会影响到后续的字节处理。
7、参考文章
字符编码的概念(UTF-8、UTF-16、UTF-32都是什么鬼)
https://blog.youkuaiyun.com/guxiaonuan/article/details/78678043
字符编码笔记:ASCII,Unicode 和 UTF-8
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
刨根究底字符编码之十四——UTF-16究竟是怎么编码的