python3的编码问题

Python3对文本(str)和二进制数据(bytes)作了更为清晰的区分。

文本默认是以Unicode编码(python2默认是ascii),由str类型表示,二进制数据则由bytes类型表示。

str=‘中文ENGLISH‘

str是文本类型,即str类型

>>> str.encode(‘utf-8‘)
b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘
>>> str.encode(‘gb2312‘)
b‘\xd6\xd0\xce\xc4ENGLISH‘
>>> bytes(str,‘utf-8‘)
b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘

bytes()函数同str.encode(),即把str类型编码为bytes类型

>>> b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘.decode(‘utf-8‘)
‘中文ENGLISH‘

解码过程,即把bytes数据转化为str

>>> b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘.encode(‘utf-8‘)
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘.encode(‘utf-8‘)
AttributeError: ‘bytes‘ object has no attribute ‘encode‘

不能把bytes数据继续编码为bytes

>>> ‘中文ENGLISH‘.decode(‘utf-8‘)
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module>
    ‘中文ENGLISH‘.decode(‘utf-8‘)
AttributeError: ‘str‘ object has no attribute ‘decode‘

也不能把str数据继续解码为str

即编码过程是从str到bytes,解码过程是从bytes到str。

>>> b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘.decode(‘gb2312‘)
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘.decode(‘gb2312‘)
UnicodeDecodeError: ‘gb2312‘ codec can‘t decode byte 0xad in position 2: illegal multibyte sequence

上面是把以utf-8编码的bytes以gb2312的方式解码,结果出错了,因为0xad没有对应的gb2312编码

如果想知道一串bytes码是以何种unicode编码方式编码的,该如何呢?这个其实是无法百分之百确定的,不然的话乱码就不会发生了。

第三方库chardet,使用函数detect可以“猜”出编码方式。

from chardet import detect>>> detect(b‘\xe4\xb8\xad\xe6\x96\x87ENGLISH‘)
{‘confidence‘: 0.7525, ‘encoding‘: ‘utf-8‘}

这里置信0.7525,可以简单理解为概率0.7525,这里只有两个中文字符,如果bytes足够长,那么置信肯定更高

>>> detect(b‘\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe6\x88\x91\xe7\x9c\x9f\xe7\x9a\x84\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87‘)
{‘confidence‘: 0.99, ‘encoding‘: ‘utf-8‘}

这里有10个中文字符,结果置信就是0.99了

时间: 2024-10-02 02:11:05

python3的编码问题的相关文章

s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf-8_*_ 或者将字符串单独声明: a = "中文".encode("utf-8") 函数式编程 函数式编程中的函数指代的是数学中的函数. 函数式编程输入如果确定,则输出一定是确定的.函数中并没有很多逻辑运算 python是一个面向对象的语言,只是一部分支持函数式编程.

一步一步搞定Python3.6编码问题

Python中的编码问题很蛋疼,我们遇到这类问题有时候会使用下面几个步骤处理该问题: 1:这么低级问题,别问同事了太丢人,赶紧百度: 2:卧槽,出了一堆广告,骂个娘,赶紧找相关解决问题方式: 3:尼玛,终于搞定,原来这么简单,赶紧搞定其它工作,晚上回头在查原因: 4:傻B单位每天加班,到家都11点了,赶紧洗洗睡了:等会,先来局王者农药...... 5:编码问题早就忘了: 6:过了几天又出现编码错误,,从第1步开始重新来过. 今天我们就花一局王者农药时间搞定Python3.6的编码问题. 搞清楚编

Python3 字符编码

编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算

关于 Python3 的编码

1.Python3 中 str 与 bytes 的转换:The bytes/str dichotomy in Python 3 2.关于utf8的bom头.(Python3下) >>> import codecs >>> codecs.BOM_UTF8 b'\xef\xbb\xbf' >>> len(b'\xef\xbb\xbf') 3 >>> codecs.BOM_UTF8.decode('utf8') '\ufeff' >&

python3 字符编码问题原理简介

Python 编码问题 python3中,所有的字符串在内存中均是unicode保存 t = 'abc' 上述语句在计算机内部的执行顺序是这样的 - 在内存中创建一个字符串 'abc' - 在程序栈寄存器中创建一个变量t - 使得寄存器中的变量t指向'abc' (也就是把字符串'abc'的地址赋给t) 虽然内存中是unicode保存,但是输出到文件中就是utf-8或者GBK等格式了,根据文件的编码类型不同而不同 字符与unicode码的相互转换 字符转十进制unicode码 >>> or

python2和python3的编码问题

python2中有两种类型 str字符串和unicode字符串 python3则改成了 bytes和str字符串 在python2中‘xxx’和b‘xxx’都是str字符串,u‘xxx’是unicode字符串,即python3中的bytes在python2是不存在的,都归属于str字符串 在python3中unicode是不存在的,被归并到str字符串里面的,即‘xxx’和u‘xxx’都是str字符串,b‘xxx’是bytes 主要的原因是python2的默认编码是asscii码,而python

Python2 与 Python3 的编码对比

在 Python 中,不论是 Python2 还是 Python3 中,总体上说,字符都只有两大类: 通用的 Unicode 字符: (unicode 被编码后的)某种编码类型的字符,比如 UTF-8,GBK 等类型的字符. Python2 中字符的类型: str: 已经编码后的字节序列unicode: 编码前的文本字符 Python3 中字符的类型: str: 编码过的 unicode 文本字符bytes: 编码前的字节序列 我们可以认为字符串有两种状态,即文本状态和字节(二进制)状态.Pyt

python3 字符编码与转码 NLP第一条

额...上通识课讲到了NLP12条,感觉讲的挺好的,照着抄一条先... 1,没有两个人是一样的 没有两个人的人生经验会完全一样,所以没有两个人的信念,价值和规条系统会是一样. 因此没有两个人对同一件事的看法能够绝对一致. 因此没有两个人对同一件事的反应会是一样的. 因此没有两个人的态度和行为模式会完全一样. 因此发生在一个人身上的事,不能假定发生在另一个人身上也会有一样的结果. 人与人之间的不同,建造了这个世界的奇妙可贵. 尊重别人的不同之处,别人才会尊重自己独特的地方. 每一个人的信念,价值观

python3中编码和解码

------------恢复内容开始------------ 一.python3与python2.7在字符编码上的差异 python2.7 默认编码是和所在的操作系统一致,windows 是 GBK,macOS是 utf8 ,linux是utf8 python3 编码统一规定默认编码为 Unicode 二.python3中str和bytes的区别 (1)python3有两种数据类型:str 和bytes. 1.编码为Unicode的文本显示为str: 2.其他编码(比如gbk,utf8等)显示为