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 字符编 ...
随机推荐
- ASP.NET提取多层嵌套json数据的方法
本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...
- SQL Server 中使用数据类型表示小数
在使用的时候发现一个问题,由于编程的习惯,当数据库中需要存储小数的时候,就想当然的使用了float类型,可结果太让人意外了. 数据库中存储了0.5没问题,当使用0.6的时候,得到的确是0.599999 ...
- Android样式和主题
样式:style--> 主题:theme--> <style name="my_style"> <item name="android:te ...
- Medial Queries的另一用法——实现IE hack
众所周知,有些时候为了实现IE下的某些效果与现代浏览器一致,我们不得不使用一些hack手段来实现目的.比如说使用"\0","\"和"\9"来 ...
- 【web开发 | 移动APP开发】 Web 移动开发指南(2017.01.05更新)
版本记录 - 版本1.0 创建文章(2016.12.30) - 版本1.1 更正了hybird相关知识:增加了参考文章(2017.01.05): + Web APP更正为响应式移动站点与页面,简称响应 ...
- UVA1368
用一个二维数组装m个字符串,然后用一个数组装每个字符串的hamming距离.找到最小的hanming距离即可 #include<stdio.h> #include<string.h& ...
- 【基础】MVC路由规则
一.RouteData解析过程 在ASP.NET MVC中,服务器收到来自客户端的请求后,会经过一些列的处理拿到请求的数据,比如在Pipeline 管线事件中,通过订阅适当的事件,将HttpConte ...
- spring context上下文(应用上下文webApplicationContext)(转载)
(此文转载:http://www.cnblogs.com/brolanda/p/4265597.html) 一.先说ServletContext javaee标准规定了,servlet容器需要在应用项 ...
- 【原创】JEECMS v6~v7任意文件上传漏洞(1)
文章作者:rebeyond 受影响版本:v6~v7 漏洞说明: JEECMS是国内Java版开源网站内容管理系统(java cms.jsp cms)的简称.该系统基于java技术开发,继承其强大.稳定 ...
- 红米2A高配刷机记录
2014816 机型:红米2A高配版 设备型号:2014816 CPU:高通 线刷:fastboot平台 http://192.168.7.118/MesReports/Reports/Cutting ...