在计算机中,所有信息最终都能以二进制字符串来表示。二进制位又叫做比特(bit),每个比特有0和1两种状态,8个比特构成了1个字节(byte),1个字节可以表示256种状态。
ASCII
ASCII码一共规定了128个字符的编码,这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后7位,最前面的1位统一为0。
Unicode
Unicode是一个容纳了上百万字符的字符集,规定了每个字符的二进制代码。但是没有制定具体的存储规则,例如当用3个字节存储一个字符时,它同时可以被理解为存储了3个ASCII码,另外我们都知道ASCII码是用1个字节存储,当规定用3个字节存储字符时,就造成了空间的极大浪费。
Unicode同时也兼容了ASCII码。
UTF-8
UTF-8是实现了Unicode的方式之一,特点是变长编码,它使用1-4个字节表示一个符号。
编码规则:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
- 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
总结为下表,x表示字符
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编码为100111000100101,用十六进制表示为U+4E25,处在上表的第三行。换成UTF-8则需要3个字节,二进制代码为11100100 10111000 10100101,转换成十六进制为E4B8A5。
参考:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html