unicode 编码总结

时间:2022-03-10 09:02:08

unicode简介:
  unicode又称为unicode character set,缩写为ucs,意为字符集。编码方式有utf-7,utf-8,utf-16,utf-32几种,常用的是utf-8和utf-16。utf-8常用于web中,utf-16是windows和java采用的编码方式。通常我们说unicode就是指utf-16。
本文主要讲讲utf-16和utf-8。

utf-16:
  utf-16同时也称为ucs-2编码,采用两个字节表示。最多可表示2^16=65536个符号。我们知道ascii码用一个字节即可表示全部的英文字母,因此对于英文而言,utf-16稍显浪费。

utf-8:
  utf-8是一种变长unicode编码,用1至4个字节表示。对于英文而言,用一个字节表示即可,此时utf-8编码与ascii编码是一模一样的。

utf-16 be和utf-16 le:
  be即big-endian,意味按高位到低位的顺序存储,那么le(little-endian)就是按低位到高位的顺序存储了。如果打开一个utf-16编码的文件最先出现的是feff,则表明是用be方式存储的。如果出现的是fffe则为le方式存储。

bom:
  在utf-16 be中用16进制表示为feff,转换为二进制是11111110 11111111(左侧为高位,右侧为低位)。在utf-16 le中用16进制表现为fffe, 因此bom的存在就是为了区分文件是用be方式还是le方式存储的。
在utf-8 be中bom用16进制表示为ef bb bf。

unicode转化为utf-8:
  utf-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的ascii码。因此对于英语字母,utf-8编码和ascii码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

Unicode符号范围 | utf-8
(十六进制) |(二进制)
-------------------------+--------------------------------------
0000 0000 - 0000 007F | 0xxxxxxx
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

找到unicode符号对应的utf-8区间,将unicode符号转换为二进制,最后一个二进制位开始,依次从后向前填入utf-8格式中的x,多出的位补0。

示例:
将utf-16 bom转换为utf-8 bom,即将0xfeff转换为utf-8 bom。

一)unicode编码feff所在的范围为0000 0800 - 0000 FFFF,因此其utf-8模板为1110xxxx 10xxxxxx 10xxxxxx,占用3个字节。
二)0x feff = 0b 1111 111011 111111,这里我是用python计算出来的,bin(0xfeff)
三)从最后一个二进制位开始,依次将每位填入utf-8模板中,多出位补0,得11101111 10111011 10111111,转换为16进制为ef bb bf,用python计算hex(0b111011111011101110111111)可得

参考文章:

1.字符编码笔记:ASCII,Unicode和UTF-8 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

2.程序员趣味读物:谈谈Unicode编码 http://www.pconline.com.cn/pcedu/empolder/gj/other/0505/616631.html