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了
__________________________________________________________________________________
从txt文件读取的问题
有两个文件ansi.txt和utf8.txt,分别保存为ansi编码和utf-8编码,里面都是‘中文ENGLISH’
>>> f_ansi=open(r'd:\ansi.txt','r')
>>> f_ansi.read()
'中文ENGLISH'
>>> f_utf8=open(r'd:\utf8.txt','r')
>>> f_utf8.read()
'锘夸腑鏂嘐NGLISH'
>>> f_utf8=open(r'd:\utf8.txt','r',encoding='utf-8')
>>> f_utf8.read()
'\ufeff中文ENGLISH'
#带BOM的utf8
记事本的ansi编码为系统本地编码,我的是gbk,所以ansi.txt的编码方式是gbk
open()函数的encoding参数默认是本地编码,也就是gbk,所以直接打开读取ansi.txt是可以的
直接打开utf8编码的txt会以gbk的解码方式读取,所以会出现乱码
验证一下
>>> '锘夸腑鏂嘐NGLISH'.encode('gbk').decode('utf-8')
'\ufeff中文ENGLISH'
python3的编码问题的更多相关文章
- s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法
python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...
- python3爬虫编码问题
使用爬虫爬取网页经常遇到各种编码问题,因此产生乱码今天折腾了一天,全部总结一遍环境:win10,pycharm,python3.41.首先先来网页编码是utf-8的:以百度首页为例:使用request ...
- day008 字符编码之 字符编码 、Python2和Python3字符编码的区别
计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...
- Python3的编码整理总结
python3在内存中是用unicode编码方式存储的,所以不能直接储存和传输,要转化为其他编码进行储存和传输. 字符串通过编码转换成字节码,字节码通过解码成为字符串 encode:str --> ...
- 字符编码 + python2和python3的编码区别(day08整理)
目录 昨日回顾 二十三.元组内置方法 二十四.散列表 二十五.字典内置方法 二十六.集合内置方法 二十七.深浅拷贝 拷贝 浅拷贝 深拷贝 今日内容 二十八.字符编码 1.文本编辑器存储信息的过程 2. ...
- python3中编码与解码的问题
python3中编码与解码的问题 ASCII .Unicode.UTF-8 ASCII 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此 ...
- Python3 字符编码
编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节 ...
- Python2 与 Python3 的编码对比
在 Python 中,不论是 Python2 还是 Python3 中,总体上说,字符都只有两大类: 通用的 Unicode 字符: (unicode 被编码后的)某种编码类型的字符,比如 UTF-8 ...
- Python2与Python3字符编码的区别
目录 字符编码应用之Python(掌握) 执行Python程序的三个阶段 Python2与Python3字符串类型的区别(了解) Python2 str类型 Unicode类型 Python3 字符编 ...
随机推荐
- 谈一下如何设计Oracle 分区表
在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,所有数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...
- css3圣诞雪景球
本来想多做几个了 无奈最近太忙 于是模仿做了一个在codepen看到的圣诞雪景球 算是送给自己的圣诞礼物 演示地址:http://www.qdfuns.com/notes/26668/d5e177 ...
- Linq 单表城市级联
var list = (from province in db.Areas && province.IsDel == join city in db.Areas on province ...
- 配置generatorConfig.xml自动生成的代码的sql书写问题
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...
- orcle函数的使用,及其调用
CREATE OR REPLACE Function getBdateT( D_Build date, Q_Date date) return Date as D_Return Date; /*返回的 ...
- 【BZOJ-2597】剪刀石头布 最小费用最大流
2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1016 Solved: ...
- Ubuntu常用命令之update-alternatives
maintain symbolic links determining default commands update-alternatives creates, removes, maintains ...
- UTF-8编码的空格(194 160)问题
前台的字符串传递到后台进行处理,发现了一个较诡异的问题:字符串中的一个空格(ASCII:32)被UTF-8编码之后变成了一个诡异的字符(ASCII:194 和 160的组合)!但在后台其表象还是空格. ...
- IScroll5兼容IE修改
水平不到家,无法像js大神那样讲得头头是道.仅做记录,以备后查. iScroll5是不兼容IE低版本的.为兼容IE低版本(以IE8为例),需做以下工作: 1.事件绑定方式兼容 众所周知,独特的IE有它 ...
- MyEclipse:各种提示图标的含义
1.新建的项目,项目名称前有黄色小警示号的原因, 2.项目名称上有红色叹号,说明缺少jar包,仔细找一下,看看缺了什么,添加进去一般就好了. 3.出现红色叉号,那说明代码错误,需要修改代码.