1. 各种编码代表什么,为什么会存在这么多编码?

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编码等各不相容;---编码汉字为一个汉字两个字节

GBK:GBK共收入21886个汉字和图形符号 ,采用双字节表示,总体编码范围为8140-FEFE之间,首字节在81-FE之间,尾字节在40-FE之间。GB2312标准共收录6763个汉字,其中一级汉字3755个。对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK 及GB18030 汉字字符集的出现。---编码汉字为一个汉字两个字节

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

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

 

2. 如何获取到字符、汉字的unicode码,根据unicode码如何转化为字符?

python中,函数ord()  chr() ,获取字符的unicode码的十进制表示,以及将一个十进制正数转化为 字符

char='哈'
print(ord(char)) #汉字 哈 的unicde码 ,十进制表示:21704
print(ord(',')) # 中文逗号的unicode码的十进制表示:65292
print(chr(65292)) # 转换后为中文的逗号,打印出来为中文的逗号

3. 拿到一串的二进制表示,能确定这个东西代表什么吗?--不能

(python)下边这些内容,为相同的字符,经过不同的编码方式之后,会得到不同的二进制编码,尤其是汉字的部分,有些汉字是用两个字节表示,有些是用三个字节表示,所以拿到

16进制的编码,如果不知道当初的编码方式是什么,可能无法确认这串二进制的编码到底代表的是什么

str1='哈哈哈'
str2='hahaha'
print(str1.encode(encoding='Unicode'))
print(str1.encode()) #默认为 utf-8,三个字节表示一个汉字 b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'
print(str1.encode(encoding='utf-8')) #utf-8,三个字节表示一个汉字 b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'
print(str1.encode(encoding='gbk')) # 两个字节一个汉字,b'\xb9\xfe\xb9\xfe\xb9\xfe'
print(str1.encode(encoding='GB2312')) #两个字节表示一个汉字,b'\xb9\xfe\xb9\xfe\xb9\xfe'
print(str1.encode(encoding='ansi'))# 两个字节一个汉字,b'\xb9\xfe\xb9\xfe\xb9\xfe'
print(str2.encode(encoding='ascii')) # b'hahah'
# print(str2.encode(encoding='ascii')) # 报错,sacii编码不支持汉字,只支持英文字母、符号、数字