python2编码问题解决了吗_Python2编码问题

以下内容说的都是 python 2.x 版本

简介

基本概念

Python “帮”你做的事情

推荐姿势

1、基本概念

我们看到的输入输出都是‘字符’(characters),计算机(程序)并不能直接处理,需要转化成字节数据(bytes),因为程序只能处理 bytes 数据。

例如:文件、网络传输等,处理的都是 bytes 数据——二进制数字。

1.1 ASCII / Unicode

孤立的 byte 是毫无意义的,所以我们来赋予他们含义。就引入‘字符集’的概念,‘字符集’就是一个码位(code point)对应的一个字符的表。

该表用于赋予 byte 意义。还需要知道一个点:因为 ASCII 字符集支持的字符太少,不能表示各个国家语言中的字符。所以就发明了

Unicode ——万国码,该字符集包含了你能用到的所有的字符。

1.2 Encode / Decode

在 python 中字符串分为两个对象:str 和 unicode

str: a sequence of bytes

unicode:a sequence of code point(码位——字符集中的数字)

unicode_obj.encode() ——> bytes ‘编码’(encode)

bytes_obj.decode() ——> unicode ‘解码’(decode)

UTF-8 是最流行的一种对 Unicode 进行传播和存储的编码方式。所以,多用它作为编码方式。

s = 'hello' # str

u = u'你好' # unicode

back_to_bytes = u.encode('utf-8')

back_to_utf8 = back_to_bytes.decode('utf-8') # 或 unicode(s, 'utf-8')

1.3 声明编码

正如前面所说的,计算机只能操作 bytes,所以 Python 在编译原文件的时候,会先把源文件进行编码,默认以‘ASCII’进行编码。这就是为什么如果源文件中带有‘中文’,需要在源文件的起始行声明编码方式。

完成编码后,源码中的所有字符,都变成了 bytes 计算机就可以进行编译和处理了。编译过程:

读取文件

不同的文件,根据其声明的编码去解析为Unicode

转换为UTF-8字符串

针对UTF-8字符串,去分词

编译,创建Unicode对象(Python解释器处理)

根据这个过程,在自己的代码中也应该按照这个逻辑处理,意思是:

接收外部数据时,统一转化为Unicode

代码内部处理的都是Unicode

输出时统一转化为UTF-8(网络数据传输、文本输出)

1.4 小结

程序中所有的输入和输出均为 byte

世界上的文本需要比 256 更多的符号来表现(ASCII是不够的)

你的程序必须能够处理 byte 和 unicode

byte 流中不会包含编码信息(编码信息会在:文件的开头、协议中等地方声明)Content-Type:text/html; charset=UTF-8

指明的编码有可能是错误的(出现乱码)

2、python “帮”你做的事情

在 python 中处理编码问题,会出现很多问题,这里就不一一列举。

这些问题大都是使用了不匹配的编码方式进行解码、编码造成的。而 python 为了语法更加简介,在一些内置方法中,使用了一些隐性转换。这种隐形的转换带了的便捷的同时也会带来一些非预期的错误。下面就一一道来。

2.1 a = "abc" + u"bcd"

a = "abc" + u"bcd",Python 会如此转换 "abc".decode(sys.getdefaultencoding()) 然后将两个 Unicode 字符合并。

2.2 两个内建方法str()和unicode(),

str:something.encode(sys.getdefaultencoding())

unicode:something.decode(sys.getdefaultencoding())

sys.getdefaultencoding()默认为:ASCII,这就是为什么str(u'中文')和unicode('中文')分别会报错:UnicodeEncodeError和UnicodeDecodeError。因为ASCII编码方式,编码/解码不了中文(支持的字符有限)。

2.3 print函数

print函数,会对输出的内容进行编码,这是因为:所谓的输出,也是从一个程序到另外一个程序。程序之间的交互都是都是传递 bytes。比方说print,就是把数据传递给 终端 ,终端也是个程序,所以print函数就把需要输出的内容编码成了 bytes,采用那种编码方式,就是

由sys.stdout.encoding参数决定的。

在交互环境下(python、ipython)输入的数据的编码则由sys.stdin.encoding参数决定。参考:What does python print() function actually do?

2.4 默认编码方式

python 的默认编发方式为 ASCII。

如何改变python的默认编码方式?:

import sys

# sys.setdefaultencoding() does not exist, here!

reload(sys) # Reload does the trick!

sys.setdefaultencoding('UTF8')

为什么要重载sys模块?

因为如果在编译.py文件的之前,改变默认编码,会影响Python的编译。

当编译完,再重载sys模块,它就是变成了第三方模块,可以随便更改,不回影响编译。setdefaultencoding()函数才可以调用。参考:Changing default encoding of Python?

3、推荐姿势

本片文章没有列举出常见的异常,因为如果看懂了上面所有的解释。再按照下面的姿势使用,那么 python2 中的编码问题,因该就不会再困扰你了。

Unicode 三明治:尽可能的让你程序处理的文本都为 Unicode 。如下图:

了解你的字符串。你应该知道你的程序中,哪些是 unicode, 哪些是 byte,对于这些 byte 串。你应该知道,他们的编码是什么。(详情见上述小结第 4 条)

测试 Unicode 支持。使用一些奇怪的符号来测试你是否已经做到了以上几点。(测试看看你的程序是否支持中文)

参考

本文同步分享在 博客"削微寒的程序员之路"(CNBlog)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GridView自定义分页

有时候的只是需要一些简单的但却是自定义的分页功能,但是又舍不得objectdatasource的排序功能,那就只有把pageddatasoure和objectdatasour结合起来, 由于pageddatasource实现的是IEnumberable,直接把objectdatasource赋给它是不行…

当年年仅18岁韩寒舌战群儒,受尽冷嘲热讽!

https://weibo.com/3251967895/Gk4nNu9Fr转载于:https://www.cnblogs.com/bakblog/p/9287258.html

在朋友圈求助的NTP问题~

之前朋友圈求助的问题最后是我一个朋友尝试了一天的配置「这个配置尝试的过程需要技术基础,但是不管如何的技术基础都是需要去不断的尝试的」,终于找到了方法,所以~我给他们送了秋天的第一杯奶茶~「是他们是因为他们都是一群我很喜欢的同事」…

JRE和JDK 1.3、1.4、1.5(5.0)、6.0 各版本下载地址大全(J2SDK,JavaSE JavaEE)

本文转载(http://hi.baidu.com/y66901356/blog/item/7d32bf0abf7d7c3ab0351d39.html)本人绝对支持原创!!!Java SE Development Kit(JDK)和Java Runtime Envirnment(JRE)1.3、1.4、1.5(5.0)、6.0 各版本下载地址大全 (J…

聊聊身边的嵌入式,英语学习利器点读笔

家里有小孩的朋友,可能对下面的这款产品不陌生。点读笔,一个会发声的电子产品,我当时为了给孩子做英语启蒙,买了小达人点读笔(上图最下方那个,另外两个分别是宝玩英语和巧虎配套的点读笔),用了好几年了&…

gps84转换gcj02公式_百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换...

//定义一些常量var x_PI 3.14159265358979324 * 3000.0 / 180.0;var PI 3.1415926535897932384626;var a 6378245.0;var ee 0.00669342162296594323;/*** 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换* 即 百度 转 谷歌、高德* param bd_lon* param bd_lat* returns {…

javascript 15位和18位身份证的正则表达式及其验证

1、简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card)(2)preg_match("/^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3}) (\d|X)?$/",$id_card)&#x…

EasyUI_datagrid

案例一丶jquery.easyui.min.js:10631 Uncaught TypeError: this.renderEmptyRow is not a function 解决方法:datagrid记录为空就会报错。是easyui里没处理return 空的方法。需要进行添加一些东西。具体我也不清楚, 案例二丶清除datagrid右侧空白区域 查…

三枚硬币自制收音机

大家好,我是记得诚。我们称这个收音机为三个硬币收音机是因为我们使用了三个硬币作为锚点,连接收音机各个部件,这将使我们的制作过程变得极为简单。在这个收音机中我们使用了一个特殊的10晶体管集成电路,使最后做出的收音机效果非…

clickhouse 增量更新_ClickHouse王炸功能即将来袭?

众所周知,MySQL 的用户群体很大,为了能够增强数据的实时性,很多解决方案会利用 binlog 将数据写入到 ClickHouse。为了能够监听 binlog 事件,我们需要用到类似 canal 这样的第三方中间件,这无疑增加了系统的复杂度。在…

在批处理文件中启动MediaPlayer播放制定文件

我们知道在运行可以使用wmplayer指令来启动一个MediaPlayer,如果需要让MediaPlayer播放制定的文件或是一个制定的流媒体发布点,我们可以使用如下的命令格式wmplayer “mms://WIN-FW.MiGu.com/12530″wmplayer “C:\wmpub\wmroot\legacy_content_clip.wmv…

双重检查锁实现单例模式的线程安全问题

一、结论 双重校验锁的单例模式代码如下: public class Singleton {   private static Singleton singleton; private Singleton() {} public static Singleton getSingleton() {     if (singleton null) { // 1       synchronized (Singleton.clas…

摇杆控制方向原理_为工业安全守好”门”!各种方向的控制阀原理图大集合

单向的、换向的....你想了解的方向控制阀都在这里了!方向控制阀门液压阀是用来控制液压系统中油液的流动方向或调节其流量和压力的。方向控制阀作为液压阀的一种,利用流道的更换控制着油液的流动方向。单向型方向控制阀是只允许气流沿一个方向流动的方向…

对于新生代农民工,你有什么想说的?

昨晚上这个新闻很多人转,但是可能很少有人知道他的链接出处,链接来自于http://www.mohrss.gov.cn/SYrlzyhshbzb/jiuye/gzdt/202108/t20210816_420736.html我记得我还在上小学的时候,我们家有干不完的农活,暑假每天都要下田干活&am…

谁是经营之神

—北京维富友携手北京服装学院开展服装ERP沙盘大赛时间4月21日,地点北京服装学院,参加人数35人,参加人员北京维富友软件公司高级讲师、服装学院教师和同学共35人。目的:为了让学生更好的掌握服装企业管理和盈利管控,北…

在Android初次的前期学习中的二个小例子(2)

Hello13:SQLite数据库 一、简述SQLite的概念和主要特性SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,使用非常方便,支持SQL语法标准和数据库事务原则。相对于SharedPreferences使用文件保存数据,SQLite具有…

access 增加字段 工具_Java效率工具之Lombok

作者:LiWenD正在掘金来源:https://juejin.im/post/5b00517cf265da0ba0636d4b上一篇:数据库查询速度优化之解决技巧还在编写无聊枯燥又难以维护的POJO吗?洁癖者的春天在哪里?请看Lombok!在过往的Java项目中&…

一文读懂 | 进程并发与同步

并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理多个任务的能力。并发和并行看起来很像,但实际上是有区别的,如下图(图片来源于网络):concurrency-parallelism上图的意思是&a…

快速完成和读懂测试计划

每个项目测试计划都会不一样,但是一般情况下,每个公司都会有相应的模板,尤其是项目很频繁的公司,相对应的模板应该就更全面,并且更容易修改,更能适应新项目。 并且,经常接触测试计划的人可能会察…

rust卡领地柜权限_RFID智能医疗耗材柜,上海智能高值耗材柜,国药智能医用耗材柜...

近几年因为我们的医疗改革一直在进步并改革,国家对我们的医疗方面的补助也有了明显的加大投入,与此同时让各种公立私立医院如雨后春笋般层出不穷,各大医院为了在医疗市场占有一席之地,都在各个方面开始想办法提升自己医院的水准。…