python中的字符串编码问题——2.理解ASCII码、ANSI码、Unicode编码、UTF-8编码

ASCII码:全名是American Standard Code for Information Interchange,ASCII码中,一个英文字母(不分大小写)占一个字节的空间,范围0x00~0x7f,即0-128。

ANSI码:ANSI编码是一种对ASCII码的拓展。ANSI编码用0x00~0x7f 范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。前126个与ASCII码相同,之后的字符全是某个国家语言的所有字符。容量2的16次方,即65536个字符。中文GB2312编码、韩文euc-kr编码、日文Shift_JIS编码等。各不相容

Unicode编码:为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求
对于 Unicode 有一些误解,它仅仅只是一个字符集,规定了符合对应的二进制代码,至于这个二进制代码如何存储则没有任何规定。它的想法很简单,就是为每个字符规定一个用来表示该字符的数字,仅此而已。

UTF-8编码:Unicode编码的一种编码实现,进行了信息压缩。一种变长的编码方式:它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,如此一来UTF-8编码也可以是为视为一种对ASCII码的拓展。
*值得注意的是unicode编码中一个中文字符占2个字节,而UTF-8一个中文字符占3个字节
*从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
*在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
----------------------------------------------------------详细了解UTF-8----------------------------------------------------------------------------
它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。
1)编码规则如下:
对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。
2)对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 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----------------------------------------------------------------------------