Python中文虐我千百遍,我待Python如初恋。本文主要介绍在Python2/3交互模式下,通过对中文、英文的处理输出,理解Python的字符编码与解码问题(以点破面)。

前言:字符串的编码一开始是 ascii,只支持英文,由于多种语言的存在,出现万国码 unicode,但 unicode 不兼容 ascii,而且对存储空间造成浪费,所以出现 utf-8 编码,一种针对 unicode 的可变长度字符编码。

Python3的字符编码与解码输出

 >>> hi = b'hello, world'
>>> hi
b'hello, world'
>>> print(hi)
b'hello, world'
>>> hi.decode('utf-8')
'hello, world'
 >>> hey = '你好'
>>> hey
'你好'
>>> print(hey)
你好
>>> unihey = hey.encode('unicode_escape')
>>> unihey
b'\\u4f60\\u597d'
>>> print(unihey)
b'\\u4f60\\u597d'
>>> unihey.decode('unicode_escape')
'你好'
>>> '\u4f60\u597d'
'你好'

在 Python3 中共有两种字符序列。一种是 str 序列,默认对字符串编码;一种是 bytes 序列,操作二进制数据流,如代码段一中的 hi,通过在字符串前的 b,即表示 bytes 。这两种序列可通过 decode 和 encode 相互转换,如下图:

在代码段一中,通过对 bytes 以 utf-8 的格式解码,得到 str。除此之外,还可通过 unicode_escape、gbk 等格式解码;

在代码段二中,通过对 str 的中文 hey 以 unicode_escape 的格式编码,得到 bytes 。用什么格式编码就用什么解码,即可得到原字符。

由于 Python3 对中文的支持友好,将 unihey 中的转义符 \ 去掉,在交互模式下可直接显示中文。

在网络传输中,如 urllib、request 等获取数据的库,通常返回 bytes 序列,这时可通过 decode 指定相应的格式经行解码,获取中文字符。

Python2的字符编码与解码输出

 >>> hi = u'hello, world'
>>> hi
u'hello, world'
>>> print hi
hello, world
>>> hi.encode('utf-8')
'hello, world'
>>> hi.encode('unicode_escape')
'hello, world'
 >>> hey = '你好'
>>> hey
'\xc4\xe3\xba\xc3'
>>> print hey
你好
>>> uhey = u'你好'
>>> uhey
u'\u4f60\u597d'
>>> print uhey
你好
>>> ghey = uhey.encode('gbk')
>>> ghey
'\xc4\xe3\xba\xc3'
>>> print ghey
你好
>>> hey.decode('gbk')
u'\u4f60\u597d'
>>> print hey.decode('gbk')
你好
>>> '\u4f60\u597d'
'\\u4f60\\u597d'

在 Python2 中也有两种字符序列。一种是 unicode 序列,如代码段一中的 hi,通过在字符串前的 u,即表示 unicode,相当于 Python3 中的 str;一种是 str 序列,相当于 Python3 中的 bytes 。这两种序列可通过 decode 和 encode 相互转换,如下图:

在代码段一中,通过对 unicode 以 utf-8、unicode_escape 的格式编码,得到 str;

在代码段二中,通过对 str 的中文 hey 以 gbk 的格式解码,得到 unicode;对 unicode 的中文 uhey 以 gbk 的格式编码,得到 str 。

在 Python 的交互模式下,直接输出是 Python 所理解的代码中的状态,而 print 输出的是给用户看到。

从代码段二的20行、21行可以看出,Python2 对中文的支持没有 Python3 友好。除此之外,当列表中有中文时,Python2 必须遍历列表,才能在交互模式下看到中文,而 Python3 直接打印列表即可。

总结

上述表述可能不到位,欢迎交流讨论!同时我们可以通过 Anaconda 切换不同的 Python 环境,去尝试上述小栗子,随便编码解码,玩坏了算我输~( ̄▽ ̄)~

Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode的更多相关文章

  1. 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode

    原文网址:http://blog.csdn.net/trochiluses/article/details/16825269 摘要:在进行python脚本的编写时,如果我们用python来处理网页数据 ...

  2. python2(中文编码问题):UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1

    python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: 'ascii' codec can't deco ...

  3. python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))

    报错: 原来用的python3.5版本后来改为2.7出现了这个错误里面的中文无法显示 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 ...

  4. python 默认编码( UnicodeDecodeError: 'ascii' codec can't decode)

    python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: 'ascii' codec can't deco ...

  5. python2 UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 7: ordinal not in range(128)

    python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: 'ascii' codec can't deco ...

  6. python2.7安装第三方库错误:UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0

    开发环境:win10, x64, pycharm社区版,python2.7.13 python2经常会遇见乱码的问题,并且一遇到中文就乱码.所以我们在安装的时候要注意,无论是解释器interpreto ...

  7. 解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 12: ordinal not in range(128)的编码问题

    当我在运行一个基于scrapy的爬虫时出现UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 12: ordina ...

  8. python2 当中 遇到 UnicodeDecodeError UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 37: ordinal not in range(128)

    使用python2 总是遇到 UnicodeDecodeErrorUnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in positio ...

  9. Anaconda中启动Python时的错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 553

    今天,在Anaconda prompt启动python遇到了如下错误: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xaf in positi ...

随机推荐

  1. 基于HTML5 Canvas 点击添加 2D 3D 机柜模型

    今天又返回好好地消化了一下我们的数据容器 DataModel,这里给新手做一个典型的数据模型事件处理的例子作为参考.这个例子看起来很简单,实际上结合了数据模型中非常重要的三个事件处理的部分:属性变化事 ...

  2. 后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便. HangFire是什么 Hangfire是一个开源框架(.NET ...

  3. RFID电动车管理,智慧城市物联网建设的入口

    原谷歌CEO施密特说:"我可以非常直接地说,互联网将消失." 互联网在20多年来帮助人们解决了信息共享.交互,几乎在瞬间颠覆了很多传统的商业模式,把卖产品变为卖内容和服务,是个了不 ...

  4. js计时函数实现秒表的开始-暂停-清零功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. centos 自带mysql卸载时出现无法卸载情况

    [dianyi@localhost ~]$ rpm -qa|grep mysql mysql-libs-5.1.52-1.el6_0.1.x86_64 [dianyi@localhost ~]$ rp ...

  6. github与git之间怎么建立连接

    git是一款强大的分布式版本控制系统,到底是什么意思呢?其实我也不知道,以后知道了再补上吧.下面咱们来讲一下github怎么与你电脑上的git建立起连接关系. 一.你要有一个github账号. 去百度 ...

  7. 智能合约语言Solidity教程系列2 - 地址类型介绍

    智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...

  8. OpenCV 实现图片的水平投影与垂直投影,并进行行分割

    对于印刷体图片来说,进行水平投影和垂直投影可以很快的进行分割,本文就在OpenCV中如何进行水平投影和垂直投影通过代码进行说明. 水平投影:二维图像在y轴上的投影 垂直投影:二维图像在x轴上的投影 由 ...

  9. 使用nginx代理跨域,使用nginx代理bing的每日一图

    前言 自从搞清楚了跨域原理后一直自鸣得意,感觉跨域没啥问题了.而事实上对关于跨域的几个header的理解也有限,但那又如何,我能做到跨域就行了.今天想把博客背景图改成bing的每日一图,发现遇到跨域问 ...

  10. javascript设计模式——享元模式

    前面的话 享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象.如果系统中因为创建了大量类似的对象而 ...