Python3.X-文本编码问题

天大地大妈咪最大 提交于 2020-05-08 02:59:36

1.请说明python2与python3的默认编码是什么?

 python的默认编码是ASCII码,python3的默认编码是utf-8

2.为什么会出现中文乱码?能列举出现乱码的情况有哪几种么?

编码的方式和解码的方式不一致,就会出现乱码现象。

比如:(1)文本内容是以gbk编码的,但是解码的方式却是utf-8,就会乱码

          (2)文本内容是以ASCII进行编码的,那就不支持中文,如果往文本中添加中文,就会显示乱码.

解决方法:用chardet获取编码格式  

import chardet
 
str = "xxxxx"
str_type = chardet.detect(str)
code = str_type['encoding']

code即为str的编码格式。但有些人反映该方法得到的编码格式不准确,速度也慢。本人亲测,速度确实一般,但是目前还没遇到不准确的情况。大家可以斟酌使用,我这里只是提供一个思路,如果谁那里有更好的方式,可以告知小弟,不吝赐教。

3.如何进行编码转换?

运用 encode(编码)和decode(解码)

decode是解码,从二进制编码格式到unicode编码格式,解码的格式需要以最开始编码的方式一致,否则出现乱码

encode是编码,从unicode格式到二级制编码格式(可以是gbk,utf-8等等)

 1 # -*- coding:utf-8 -*-  
 2 
 3 str = "你好" #py3默认编码是utf-8
 4 print('unicode:', type(str),str)
 5 str = bytes(str, encoding='utf-8')  # 先编码,转换成bytes二进制类型
 6 print(type(str), str)
 7 str = str.decode("utf-8")   #再解码,若这个地方写gbk,就会出现乱码错误
 8 print('用utf-8编码成bytes类型,再解码成unicode:',type(str), str)
 9 str=str.encode("gbk")
10 str=str.decode('gbk')
11 print('用gbk编码成unicode,再解码:', type(str), str)
View Code

 

4. # -*- coding:utf-8 -*-  这句话的作用是什么?

文本编码方式默认为utf-8

5.解释py2 bytes vs py3 bytes的区别

(1)Python 3 所有的 strings 均是 unicode 类型,如果要转换成bytes类型,则需要进行编码声明,比如:

str ⇒ bytes:bytes(s, encoding='utf8')
bytes ⇒ str:s.decode('utf-8')

在python2.x 中是不区分bytes和str类型的,str的所有操作bytes都支持。但是在python3中bytes和str中是区分开的。

python2 中     

>>> s = "abcdefg" 
>>> b = s.encode()    #或者使用下面的方式

>>> b = b"abcdefg"
>>> type(b)
<type 'str'>

python3中                  #str和bytes是严格区分的

>>> s = "abcdefg"
>>> type(s)
<class 'str'>
>>> b = b"abcdefg"
>>> type(b)
<class 'bytes'>

str是文本系列,bytes是字节系列

文本是有编码的(UTF-8,GBK,GB2312等)

字节没有编码

文本的编码指的是字符如何使用字节来表示组织方式,linux下默认都使用UTF-8

 (2)bytes与str之间的转换-------编码

bytes由str通过encode方法转化得到的,str也可以通过bytes 通过decode方法转化得到

通过b前缀可以定义bytes

GBK 是双字节,UTF-8 灵活编码,1字节,2字节,3字节,4字节都有,最大支持6字节长度,中文大多数是3字节

 

>>> S = "我是中国人"
>>> S
'我是中国人'
>>> b = S.encode()               #进行编码为bytes
>>> b
b'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> b.decode()                      #进行解码为字符串
'我是中国人'
>>> 

str被编码成什么格式的,就需要使用什么格式的编码进行解码

>>> S = "我是中国人"
>>> S
'我是中国人'
>>> b = S.encode('GBK')
>>> b
b'\xce\xd2\xca\xc7\xd6\xd0\xb9\xfa\xc8\xcb'
>>> b.decode('GBK')
'我是中国人'

(3)bytes的操作

bytes具有string类型的所有操作,bytes可以通过str encode转化,也可以通过前缀b定义

>>> b = b'abc'
>>> b
b'abc'
>>> b.decode()
'abc'


>>> len(('我是中国人').encode())      #求bytes的长度
15
>>> b
b'abc'
>>> b.hex()                                       #转化为16进制
'616263'

>>> bin(616263)                                 #转化为2进制
'0b10010110011101000111'

 

6.文件处理

(1)读取文件是,r和rb的区别是什么?

对于 Python 3 环境:

  • r:Python 将会按照编码格式进行解析,read() 操作返回的是str
  • rb:也即 binary mode,read()操作返回的是bytes

(2)解释一下open中三个参数的作用。
  open(f_name,'r',encoding="utf-8")

第一个位置参数f_name指的是打开的文件的名字。

第二个位置参数‘r’指的是用读模式打开。

第三个位置参数encoding='utf-8',指的是读取文件的编码格式为:utf-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!