方便记忆
参考文章
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
ASCII码:
一个字节表示,最多有256种状态,其中,128种被编码成英文等常用字符。这对于英语国家是完全够使的,但对于其他国家,比如中国,常用汉字就有十万种,很明显是不够用的。为了解决这个问题,就必须对ASCII码进行扩展。但不同国家所拥有的符号都不一样,怎么把这个统一起来呢?
Unicode码:
首先需要搞清楚的是Unicode只是一个字符集,里面包含有世界各地的符号,每个符号被映射成为一个数字。Unicode只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如汉字的严字,在Unicode编码中是Hex:25 4e。占了十五位,至少用两个字节存储。其他更大的数字需要三到四个字节存储。这样就会有以下解决方案。
1、统一用四个字节存储。utf-32这样的坏处也可想而知,平常汉语加英文最多俩字节就可以了,如果用四个存储,空间整整多了一倍,会造成极大的资源浪费。
2、可变长存储。utf-8存储方式。开头ef-bb-bf代表utf-8存储方式。如果单字节存储,开头为0,后面七位为这个符号的Unicode编码。大于1字节存储的符号,开头为n个1,第n+1位为0。后面连n-1个字节开头都为10。剩下的位为unicode-big-endian编码的码数。左靠齐的。
3、码数范围内特殊的存储方式。UCS-2
在码数不超过0x ffff的范围内,可以用二字节存储unicode码,这时候有两种存储方式,一种小头在后,little-endian(Unicode),一种大头在后big-endian编码。统一用两子节编码。
编码方式 | ASCII | unicode | unicode-big-endian | utf-8 | ANSI |
含义 | 英文字母和常用符号编码 | 小头在后unicode二字节码数范围内unicode编码
| 大头在后unicode二字节码数范围内unicode编码 | 所有unicode码数范围内编码 | 系统默认编码方式。简体中文环境下GB2312,英文ASCII码。 |
是否适用于unicode | 是 | 是 | 是 | 是 | 不是 |
码数范围 | 英文+常用符号 | [0,0xffff] | [0,0xffff] | 所有unicode码 | 英文字符+中文 |
每个字符所占字节数是否相同 | 相同 | 相同 | 相同 | 不相同 | 不相同
|
实例:
“严”字:
ANSI编码:
Unicode编码:
Unicode-big-endian编码:
Utf-8编码:
可以看出来ANSI编码方式在有简体中文的情况下默认采用GB2312的编码方式,繁体中文会采用big5编码。
中英文混编的情况下“yan严”:
ANSI编码: 英文ASCII码,中文GB2312
Unicode编码:
Unicode-big-endian编码:
Utf-8编码: