Python3.X-文本编码问题

Posted cyhv5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3.X-文本编码问题相关的知识,希望对你有一定的参考价值。

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‘



































以上是关于Python3.X-文本编码问题的主要内容,如果未能解决你的问题,请参考以下文章

如何测试文本片段是不是是 Quoted-printable 编码的

Python3.X Socket 一个编码与解码的坑

将base64编码的Textmate片段过滤回文本

python2.x 与 python3.x的区别

python3.X 复学--字符串和编码(谁懂我的细节)

Python3.x和Python2.x的区别