python3 字符编码
1.字符集概述:
一套文字符号(如:一个汉字,一个表情,一张图片等)及其编码的描述
第一个计算机字符集是ASCII
2.相关概念
位:计算机中的最小单位,二进制中的一位,用二进制的0或1表示
字节:8位是一个字节
字符:我们肉眼可见的文件和符号
字符集:字符的集合
编码:将字符转换成计算机可识别的0/1代码
解码:将计算机表示的0/1代码转换成肉眼可见的字符
3.字符编码的起源ASCII
背景:
计算机只能计算和识别二进制,必须让计算机识别文字,才能和计算机进行交互,彼此也才能通过计算机通信。
由此,有了ASCII编码的诞生,它起始于50年代后期,在1967年定案,是最初美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准。
八位二进制最多可以表示的十进制数字范围是,0000 0000 ~ 1111 1111 = 0 ~ 255 ,一共256个不同数字。
ASCII编码就是将常用的英文字符和符号,与256个数字逐一对应起来形成的对应表。
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码;
后来又扩展了128个,称为扩展ASCII码。
例如:十进制33对应叹号!,65对应大写A,83对应大写S,97对应小写a
这样我们输入字符,计算机转换成十进制,再转换成二进制,就可以通过计算机计算或传输。
中英文都需要断句才能明确含义,二进制也一样。
一串二进制数字,没有规定开头结尾,是无法准确识别转换成十进制,从而对应编码找出对应字符的。
ASCII编码一共256个,0~255,最多八位二进制就能表示完全,所以规定八位二进制为一个单位,不足前面补0;
例如:大写A对应十进制65,计算机里就是0100 0001,这样一串二进制就能八位一读写,准确识别。
在这里,每一位0或者1所占的空间单位为bit(比特),这是计算机中最小的表示单位;
每8个bit组成一个字节,这是计算机中最小的存储单位(毕竟你是没有办法存储半个字符的)
4.GBK编码
GB2312:中国国家标准的简体中文字符集。它收录了6千多个常用汉字,覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。1981年5月1日实施。
技术特征,采用2个字节表示,第一字节为“高字节“,而称第二字节为“低字节”。并采用分区表示,每区含有94个汉字/符号。这种表示方式也称为区位码。
包含内容,GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。
其中包括6763个汉字;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。
GBK:1万多个汉字 *
GB18030:中国政府2000年发布的新版汉字编码标准。总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。
上面三种GB*可以统一称为ANSI编码,且16个bit的第一个必定是1。
BIG5:繁体字符集,用于台湾地区,1984年由台湾五个大公司创立,故称大五码。
5.字符编码:大一统
Unicode:1994年发布的,两字节表示的世界通用码,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
UTF-8:一种以8个bit为一组的Unicode的表示格式,UTF-8最大的一个特点,就是它是一种变长的编码方式。 它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
UTF-16:16个bit为一组
6.python3中字符串
是以unicode编码的,也就是说python的字符串默认支持多语言( UTF-8是Unicode的实现方式之一.)
对于单个字符的编码操作:
ord():将单个字符转换成整数表示
chr():将整数转换成单个字符
a='常' ord(a) 24120 chr(24120) '常'
示例:使用encode()编码:将字符串转换成bytes类型
txt='落红不是无情物,化作春泥更护花' b_txt=txt.encode('utf-8') #返回的是一个字节类型(计算机能将字节类型转换成二进制) b_txt b'\xe8\x90\xbd\xe7\xba\xa2\xe4\xb8\x8d\xe6\x98\xaf\xe6\x97\xa0\xe6\x83\x85\xe7\x89\xa9\xef\xbc\x8c\xe5\x8c\x96\xe4\xbd\x9c\xe6\x98\xa5\xe6\xb3\xa5\xe6\x9b\xb4\xe6\x8a\xa4\xe8\x8a\xb1'
使用decode()方法解码:将bytes类型转换成字符串
txt='落红不是无情物,化作春泥更护花' b_txt=txt.encode('utf-8') b_txt b'\xe8\x90\xbd\xe7\xba\xa2\xe4\xb8\x8d\xe6\x98\xaf\xe6\x97\xa0\xe6\x83\x85\xe7\x89\xa9\xef\xbc\x8c\xe5\x8c\x96\xe4\xbd\x9c\xe6\x98\xa5\xe6\xb3\xa5\xe6\x9b\xb4\xe6\x8a\xa4\xe8\x8a\xb1' c_txt=b_txt.decode("utf-8") c_txt '落红不是无情物,化作春泥更护花'
文件的操作
with open('c:/Users/cale/encode.txt','w') as f1: f1.write("三十而立,四十不惑,五十而知天命") with open('c:/Users/cale/encode.txt','r') as f1: f_con=f1.read() print(f_con) 三十而立,四十不惑,五十而知天命
with open('c:/Users/cale/encode2.txt','wb') as f1: f1.write("六十而耳顺") #如果以wb模式写入,但是写入的是字符串会报错,如下 Traceback (most recent call last): File "<input>", line 2, in <module> TypeError: a bytes-like object is required, not 'str' 正确的写法: with open('c:/Users/cale/encode2.txt','wb') as f1: f1.write("六十而耳顺".encode('utf-8')) with open('c:/Users/cale/encode2.txt','rb') as f1: f_con=f1.read().decode('utf-8') print(f_con) 六十而耳顺
复制图片
pngData=b'' #读取图片里面的内容 with open("c:/Users/cale/1.png",'rb') as f1: pngData=f1.read() #将图片内容写入到另一个文件中 with open("c:/Users/cale/2.png",'wb') as f1: f1.write(pngData)
获取文件的编码类型
import chardet def get_encoding(file): with open(file,'rb') as f: data=f.read() return chardet.detect(data) file_name='c:/Users/cale/1.png' encodingData=get_encoding(file_name) print(encodingData) {'encoding': None, 'confidence': 0.0, 'language': None} encodingData=get_encoding('c:/Users/cale/encode.txt') print(encodingData) {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}