字符编码
ASCII 编码
ASCII占用8位(bit)。8个bit可以表示256个字符。
ASCII码只规定了128个字符的编码。
ASCII码的问题是字符太少,不能满足世界各国的需要。所以各国其他编码利用剩余的128个字符定义各自不同的编码。
GB2312 & GBK
汉字GB2312 使用两个字节(16位),最多表示65536个字符。
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFEgb2312中两个字符组成的编码的字符叫做“全角”字符,而原来在127号以下的那些就叫”半角”字符了
对GB2312扩展就得到了GBK,再扩展得到GB18030(少数民族文字)。
所以,一个字节小于127的编码都按照ASCII码查,大于127的字节+之后的字节(一共两个字节16位)组成汉字的编码。
所以,“一个汉字两个英文字符”就是这么来的。
Unicode
为了统一一种编码,Unicode出现了。
Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。最前面的65536个字符位,称为基本平面(缩写BMP) 。每个平面有 65536 个码点。
Unicode只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法。
最直观的编码方案就是 UTF-32
The characters “U+” are an ASCIIfied version of the MULTISET UNION “⊎” U+228E character (the U-like union symbol with a plus sign inside it), which was meant to symbolize Unicode as the union of character sets. See Kenneth Whistler’s explanation in the Unicode mailing list. (https://stackoverflow.com/que...)UTF-32
由于Unicode是0x0000 至 0x10FFFF,直接用定长的4个字节来表示对应的字符
U+0000 = 0x0000 0000 U+597D = 0x0000 597D
这样好处是直观,但是太浪费空间了。
为什么不用utf-24呢?都用3个字节表示。UTF-8
UTF-8是一种变长的编码,从1字节到4字节。
英文字母为1个字节,汉字为3个字节。
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