python编码是什么_Python编码

什么是编码与解码?

人类可以理解、易懂的信息称为“明文”(plain text)。为了传递信息,我们需要能将明文记录的信息,转成另外某种标准记录的信息进行传递,同时为了接收信息,我们还需要能将另外某种标准记录的信息,转回成明文记录的信息。比如打电话,需要将语音信息,转换成模拟信号或者数字信号记录的信息进行传递;同时,还需要将模拟信号或者数字信号记录的信息,转换成语音信息。

将明文转成另外某种标准记录的信息的方式称为“编码”,从另外某种标准记录的信息转回成明文的方式则为“解码”。

文件在磁盘与内存的编码

文件在保存时,存储在磁盘中的格式为通过某种编码格式规范方式编码的字节码bytes。文件在保存之前,数据是存在于内存中,在内存中存储的格式是unicode。

当一个软件保存文件时,首先读取内存中unicode的数据,然后将内存中unicode的数据,按照软件默认指定的编码格式规范,例如utf8,转换成字节码bytes,保存在磁盘上。

当一个软件打开文件时,首先读取磁盘上字节码bytes的数据,然后按照软件默认指定的解码格式规范,比如utf8,将字节码bytes解码成unicode存储在内存中,从而显示在屏幕上。

如果文件保存时,使用的是utf8格式规范进行编码,那么如果打开文件时,使用的也是utf8格式规范进行解码,文件就能正常解码;如果打开文件时,使用的不是utf8格式规范进行解码,比如BGK格式规范进行,因为编码时格式规范与解码时的格式规范不同,所以不能正常解码,显示为乱码。

比如Windown系统默认使用的GBK格式规范,所以编码和解码时,使用的也是GBK格式规范。而Linux或Unix系统默认使用的是utf8格式规范,编码和解码时,使用的也是utf8格式规范。所以,如果在Windown系统下保存的文件,使用的是默认的GBK格式规范编码,那么在Linux或Unix系统下打开时,使用的是默认的utf8格式规范解码,编码与解码的格式规范不同,不能正常解码,显示为乱码。

编码规范

ascii编码是采用1个字节来存储,也就是8位,最多只能表示2^8也即256个字符。这在全世界各种语言文字上远远不够,单拿中国汉字来讲,常用的汉字也有6000多个。因此,为了满足全球各个国家不同语言的编码需求,全球统一码联盟提出了unicode编码。unicode编码默认情况下会采用2个字节存储字符(UCS-2),这样能够存储的2^16也即65536个字符,但也还是不能满足全世界所有语言,因此后来又补充了用4个字节存储(UCS-4),这就可以包含全球所有的文字了。

unicode是一个字符集,相当于一个字典,全世界所有的字符或者标点符号都对应一个数字。计算机中显示这个字符的时候,就使用unicode字符集中对应的那个数字就可以了。

utf-8、gbk、latin-1、ascii都是具体的编码实现。 因为unicode中,将大部分的字符都用2个字节存储,但是对于英文字母,比如a,其实他只需要一个字节就够了,如果都用2个字节存储,那么比较浪费硬盘空间或者浪费流量,因此unicode并不适合用来存储。而utf-8则是unicode的一种实现方式,他默认会使用8位,也就是一个字节存储,如果存储不下了,则会动态的改变大小用来存储字符。因此utf-8比较节省空间,并且也可以包含全世界所有的字符。

Python的编码解码

python2的string编码

因为Python早于unicode发布,在Python2版本中,默认的字符串编码采用的是ascii格式规范。Python2在读取文本文件时,默认会将文本中byte按ascii格式规范解码为unicode,一旦遇到非ASCII字符,解码就会失败,出现UnicodeDecodeError的错误。

在文件开头位置声明#coding:utf8,用来告诉Python解释器在读取这个源代码文件时,不要使用默认的ascii格式规范解码,而是用utf8来解码。而python3的解释器默认使用utf8编码,所以不需求声明。所以python文件必须保存为utf8格式。

import sys

# 显示python默认的编码格式

print(sys.getdefaultencoding())

# ascii

reload(sys)

# 设置字符串在转换编码时候的默认编码

sys.setdefaultencoding('utf-8')

print(sys.getdefaultencoding())

# utf-8

python2中,有两种字符串类型:str类型和unicode类型。str类型是字节数据,unicode类型是unicode数据。unicode类型是明文,将unicode类型转换为str类型,就是编码encode,将str类型转换为unicode类型,就是解码decode。

#coding:utf8

s1='张' # 字节码

print type(s1)

#

# 内置函数repr返回一个对象的string格式

print repr(s1)

# '\xe5\xbc\xa0'

s2=u'三'

print type(s2)

#

print repr(s2)

# u'\u4e09'

s3='张三' #字节码

# 用utf8格式规范解码

u=s3.decode('utf8')

print u

# 张三

print type(u)

#

print repr(u)

# u'\u5f20\u4e09'

print repr(s2)

# u'\u4e09'

# 用utf8格式规范编码

b=s2.encode('utf8')

print b

# 三

print type(b)

#

print repr(b)

# '\xe4\xb8\x89'

# 用gbk格式规范解码,出错

u2=s1.decode('gbk')

print len('张三')

# 6(字节码长度)

python3的string编码

python3也有两种数据类型:str和bytes。str类型是unicode数据,bytse类型是bytes数据。python3将python2中的unicode数据类型重命名为str类型,将python2中的str类型重命名为bytes类型。python3的解释器默认使用utf8编码。

import json

s='张三' # unicode

print(type(s))

#

print(json.dumps(s))

# "\u5f20\u4e09"

b=s.encode('utf8')

print(type(b))

#

print(b)

b'\xe5\xbc\xa0\xe4\xb8\x89'

u=b.decode('utf8')

print(type(u))

#

print(u)

# 张三

print(json.dumps(u))

# "\u5f20\u4e09"

print(len(s))

# 2

其它乱码问题

命令行乱码问题

cmd.exe本身也一个软件,python2解释器按声明的utf8编码文件,解释器正常执行,也不会报错。但是python2将print的内容会传递给cmd.exe用来显示时,python2传递的是utf8编码的字节数据,但cmd.exe默认的编码解码方式是GBK,所以用GBK的解码方式去解码utf8就会出现乱码。python3传递给的是unicode数据,cmd.exe可以识别内容,所以显示没问题。

open()中的编码问题

当执行open函数时,调用的是操作系统打开文件,操作系统用默认的gbk编码去解码utf8的文件,就会出现乱码。可以使用open('hello',encoding='utf8'),指定文件打开的编码规范。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值