来简单了解一下,让人头疼的字符编码:ASCII,Unicode和UTF
在计算机中,所有的东西最终都归为二进制。每一个二进制位(bit)都只有0和1两种状态。八个二进制位就可以组成256种状态,也就是字节(Byte)。所以,有几个二进制位,就可以表示2的n次方种不同的状态。
如果用128种状态(七个二进制位),每个状态对应一个符号,那就可以有128种符号。
一、ASCII码
ASCII码是美国制定的一套字符编码,统一规定了英文字符与二进制位的关系。ASCII码一共规定了128个字符的编码,它只占用了一个的字节的后面7位,最前面以为统一规定位0
。
对于英文来说,128个符号编码足够了,但对于其他语言来说,是远远不够的。所以,存在这样一种编码,将世界上所有的符号都包含在里面,每一个符号都有独一无二的编码。这样的编码叫Unicode,这是一种所有符号的编码,所以它也叫万国码。
二、Unicode
Unicode为世界上的所有字符都分配了一个唯一的数字编号,这个编号范围从0x000000到0x10FFFF(十六进制),具体的可以查阅unicode.org。
Unicode涵盖了所有的符号,但是它只是一个符号集,只规定了符号的二进制代码,却没有规定这个二进制代码应该如果储存。实际上,有很多种实现方式,UTF-8、UTF-16、UTF-32……都是 Unicode编码 的一种实现。
三、UTF-8
UTF-8是在互联网上使用最广的一种Unicode的实现方式,其他方式还包括UTF-16(字符用两个字节或四个字节表示),UTF-32(字节用四个字节表示)。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1-4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则有两条:
- 对于单字节的符号,字节的第一位设为
0
,后面7位为这个符号的Unicode码。对于英语字母来说,UTF-8和ASCII是相同的 - 对于
n
字节的符号,第一个字节的前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 |
其实解读UTF-8编码非常简单:如果一个字节的第一位是0
,则这个字节单独就是一个字符;如果第一位是1
,则连续有多少个1
,就表示当前字符占用多少个字节。
参考Blog:
https://blog.youkuaiyun.com/qq_36761831/article/details/82291166
https://blog.youkuaiyun.com/Deft_MKJing/article/details/79460485#commentBox
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html