写在之前

字符编码问题几乎是会跟随我们整个编程生涯的一大魔障,一不小心各种玄学的问题就会接踵而至,防不胜防,尤其是对初学者来说,碰到编码问题简直是就是加快了踏上从入门到放弃的传送带。

字符集问题

很多时候在使用 Python 编程的时候,如果不使用 Unicode,处理中文的时候会出现一些让人头大的事情,当然这个是针对 Python2 版本来说的,因为 Python3 默认使用的是 Unicode。具体如下所示:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
>>> name = '李四'>>> name'李四'>>> print(name)李四>>> len(name)6>>> name[:1]'æ'>>> print(name[:1])

通过上面的例子可以看到,我们在代码中使用中文以后,求字符串的长度和对其进行切片操作都没有按照我们预想的方式输出结果,当然有懂得读者知道这个问题用 Unicode 就可以轻松解决,但真的是轻松解决么?如果你对字符集编码只是半瓶子醋,新出现的问题又会让你头大如斗。具体如下所示:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
>>> name = u'李四'>>> nameu'李四'>>> name[:1]u'李'>>> print(name[:1])李>>> with open('./Desktop/test', 'a') as f:... f.write(name)... Traceback (most recent call last):File "<stdin>", line 2, in UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

上述的代码出现了错误,报错的原因很简单,因为我们定义了一个 Unicode 字符串 u’李四’,然后我们想把它保存到文本文件里,但是我们没有指定文件的编码,所以默认的是 ASCII 编码,显然用 Unicode 表示的汉字是无法用 ASCII 码存储的,所以就抛出了 UnicodeEncodeError 异常。

Python2 & Python3 的 Unicode

前面铺垫的够多,现在我们算是正式来看 Python 中的字符串与字符编码之间的调用。

首先来说 Python3,Python3 里有两种表示字符序列的类型,分别是 bytes 和 str,bytes 的实例包含 8 位值,str 的则包含 Unicode 字符。Python2 中也有两种表示字符序列的类型,分别是 str 和 Unicode,它与 Python3 的不同是,str 的实例包含原始的 8 位值,而 Unicode 的实例包含 Unicode 字符。这是什么意思呢?也就是说 Python3 中字符串默认为 Unicode,但是如果在 Python2 中需要使用 Unicode,必须要在字符串的前面加一个 「u」前缀,形式参考上面例子中的写法。

当然了,在 Python2 中也可以默认使用 Unicode 的字符串,执行下面的操作即可:

from __future__ import unicode_literals

Python 字符串有 encode 和 decode 方法,用这两个可以对字符串进行编码或解码,我们来看一个在 Python2 下运行的例子:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
>>> name = '李四'>>> name'李四'>>> my_name = name.decode('utf8')>>> my_nameu'李四'>>> print(my_name)李四>>> my_name.encode('utf-8')'李四'

既然我们知道了 encode 用于编码,decode 用于解码,那么对于之前我们抛出异常的那个例子我们可以手动解决,具体如下所示:

>>> with open('./Desktop/data.txt', 'a') as f:... f.write(name.encode('utf-8'))... >>> with open('./Desktop/data.txt', 'r') as f:... data = f.read()... >>> data.decode('utf-8')u'李四'

上述代码是字符串较短的情况,如果需要写入的字符串很多,每次都要手动进行编码将会变的非常低效,Python2 中有个「codecs」模块可以解决这个问题:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
>>> import codecs>>> nameu'李四'>>> with codecs.open('./Desktop/data.txt', 'w', encoding='utf-8') as f:... f.write(name)... >>> with codecs.open('./Desktop/data.txt', 'r', encoding='utf-8') as f:... data = f.read()... >>> datau'李四'

而在 Python3 中内置的 open 就已经支持指定编码风格:

>>> name = '李四'>>> name'李四'>>> with open('./Desktop/data.txt', 'w', encoding='utf-8') as f:... f.write(name)...

把 Unicode 字符表示为二进制的数据有很多种办法,最常见的就是 utf-8,但是这里需要我们明白的是,Unicode 是表现形式,utf-8 是存储形式,utf-8 虽然是使用最广泛的编码,但也仅仅是 Unicode 的一种存储形式罢了。

当然字符编码的问题还有很多,我也不可能面面俱到,最后我还是希望你可以在一开始的时候就彻底的搞定字符编码的东西,拿出一些时间来好好研究一下,不然这个东西会成为你编码路上挥之不去的“噩梦”。

不要再问我Python2和Python3的Unicode 问题啦!相关推荐

  1. python2与python3转换记录

    为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来,但是仍然有很多项目采用Python2开发.Linux的许多 ...

  2. 在同一台电脑上同时安装Python2和Python3

    目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3,取决于当前要使用的库.框架支持哪个版本. 例如:HTM ...

  3. python2和python3分别是python的两个版本_Windows下Python2与Python3两个版本共存的方法详解...

    前言 一向用Python 3,最近研究微信公众号开发,各云平台只支持Python 2.7,想用其他版本需要自己搭建环境.而网上又搜不到Python 3开发微信公众号的资料.暂打算先使用Python 2 ...

  4. 切换Python2和Python3的方法

    Windows环境: 在windows环境下安装python2与python3,如何切换二者使用 输入py -3,即进入python3 输入 py -2,即进入python2 Linux环境: 0x0 ...

  5. python2 与 python3的区别整理

    目录 前言 print语句 UNICODE字符串 全局函数UNICODE() LONG长整型 <>比较运算符 字典类方法HAS_KEY() 返回列表的字典类方法 重命名或重新组织的模块 H ...

  6. python2 与 python3的区别总结

    python2 与 python3的区别总结 几乎所有的Python 2程序都需要一些修改才能正常地运行在Python 3的环境下.为了简化这个转换过程,Python 3自带了一个叫做2to3的实用脚 ...

  7. python3各版本区别-Python2 与Python3的版本区别实例分析

    本文实例讲述了Python2 与Python3的版本区别.分享给大家供大家参考,具体如下: 现在还有些开源模块还没有更新到python3 ,不了解版本区别,无法对不合适的地方进行更改. 由于只追求向P ...

  8. python2好还是python3好-总结对比Python2和Python3之间的区别

    首先要说的是,Python的版本,目前主要分为两大类: Python 2.x的版本的,被称为Python2:是目前用的最广泛的,比如Python 2.7.3. Python 3.x的版本的,被称为Py ...

  9. python3生成一个定长列表_range方法在Python2和Python3中的不同

    range 列表 range()方法是Python中常用的方法, 但是在Python2和Python3中使用方法不同,下面看下它们的不同使用方法. range方法详解 range(start, sto ...

最新文章

  1. BERT是图像预训练未来?字节跳动iBOT刷新十几项SOTA,部分指标超MAE
  2. 底盘编码数据解算ROS的odom数据
  3. flutter开发vscode插件推荐(开发必备)
  4. 中国石油大学计算机专业调剂信息,2014年中国石油大学(北京)计算机专业考研调剂信息(新)...
  5. 二维数组最大值首尾相连
  6. android开发(4) 闪屏的实现
  7. HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
  8. 工程项目利用AutoMake生成Makefile实战
  9. JavaScript实现解析xml文件数据
  10. 如何把网页保存为PDF
  11. thinkPHP6报错:Failed to listen on 0.0.0.0:8000 (reason: һַȨ޲“
  12. Arithmetic Progressions
  13. 小米笔记本开机提示:no bootable device -- insert boot disk and press any key
  14. EasyClass!Query类
  15. 计算机系高考激励的句子,高考激励人心的句子
  16. 常见数学中的特殊符号
  17. MySQL表操作的三个命令
  18. python有哪些细节描写_细节描写的句子有哪些
  19. 一款很好看的个人主页html源码免费下载
  20. (java)求最大公约数

热门文章

  1. 用rate-limit来限制特定用户的流量
  2. fastreport(A)
  3. maven2学习总结(1,入门起步与实践)
  4. python调用接口实例化_python 类静态方法实例化另一个类对象的问题?
  5. 【MM】新建移动类型(Movement Type)
  6. PP面向订单生产模式探讨
  7. TSV_TNEW_PAGE_ALLOC_FAILED
  8. 10个凭证类型的速记
  9. 三种会计科目表:运营会计科目表、国家会计科目表、集团会计科目表
  10. 2021年网购大数据:哪些品类坑最多?什么价位的商品最有保障?