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'}

  

posted @ 2022-08-31 11:25  pple  阅读(205)  评论(0编辑  收藏  举报
以终为始,你期待的那天不会太遥远。