阅读更多
引用
本文来自微信公众号Python之禅(VTtalk)
作者:刘志军


题图:unsplash.com

Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。Python 编码为什么那么蛋疼?已经介绍过 Python2 字符串设计上的一些缺陷:
- 使用 ASCII 码作为默认编码方式,对中文处理很不友好。
- 把字符串牵强地分为 unicode 和 str 两种类型,误导开发者
当然这并不算Bug,只要处理的时候多留心也可以避免这些坑。但在 Python3两个问题都很好的解决了。

首先,Python3把系统默认编码设置为UTF-8
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

然后,文本字符和二进制数据区分得更清晰,分别用str和bytes表示。文本字符全部用str类型表示,str能表示Unicode字符集中所有字符,而二进制字节数据用一种全新的数据类型,用bytes来表示。

str
>>> a = "a"
>>> a
'a'
>>> type(a)
<class 'str'>

>>> b = "禅"
>>> b
'禅'
>>> type(b)
<class 'str'>

bytes
Python3 中,在字符引号前加‘b’,明确表示这是一个 bytes 类型的对象,实际上它就是一组二进制字节序列组成的数据,bytes 类型可以是 ASCII范围内的字符和其它十六进制形式的字符数据,但不能用中文等非ASCII字符表示。
>>> c = b'a'
>>> c
b'a'
>>> type(c)
<class 'bytes'>

>>> d = b'\xe7\xa6\x85'
>>> d
b'\xe7\xa6\x85'
>>> type(d)
<class 'bytes'>
>>>

>>> e = b'禅'
  File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.

bytes类型提供的操作和str一样,支持分片、索引、基本数值运算等操作。但是str与bytes类型的数据不能执行+操作,尽管在py2中是可行的。
>>> b"a"+b"c"
b'ac'
>>> b"a"*2
b'aa'
>>> b"abcdef\xd6"[1:]
b'bcdef\xd6'
>>> b"abcdef\xd6"[-1]
214

>>> b"a" + "b"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

python2与python3字节与字符的对应关系


encode 与 decode
str与bytes之间的转换可以用encode和从decode方法。

encode负责字符到字节的编码转换。默认使用UTF-8编码准换。
>>> s = "Python之禅"
>>> s.encode()
b'Python\xe4\xb9\x8b\xe7\xa6\x85'
>>> s.encode("gbk")
b'Python\xd6\xae\xec\xf8'

decode负责字节到字符的解码转换,通用使用UTF-8编码格式进行转换。
>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode()
'Python之禅'
>>> b'Python\xd6\xae\xec\xf8'.decode("gbk")
'Python之禅'


攒课第二期如期而至,现在报名即可享受专属优惠!

  • 大小: 192.5 KB
  • 大小: 25.1 KB
  • 大小: 20.5 KB
  • 大小: 193.3 KB
0
1
评论 共 1 条 请登录后发表评论
1 楼 nalan 2017-04-09 15:59
不错,虽然简单,但解释得很清楚。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Python3中将\uXXXX字符串转换为可见字符串的解决方案

    本文主要介绍了Python3中将\uXXXX字符串转换为可见字符串的解决方案,希望能对新手有所帮助。下图为成功转换后的截图,具体转换方法和代码见下文。 文章目录 1. 问题描述 2. 原理详解 3. 解决方案

  • Python3如何解决字符编码问题详解

    字符串是一种数据类型,但是,字符串比较特殊的是还有一个...下面这篇文章主要给大家介绍了关于Python3如何解决字符编码问题的相关资料,文中介绍的还是相对比较详细的,需要的朋友可以参考借鉴,下面来一起看看吧。

  • python3设置编码为utf8_Python3 是如何解决棘手的字符编码问题的?

    Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。Python 编码为什么那么蛋疼?已经介绍过 Python2 字符串设计上的一些缺陷:使用 ASCII 码作为默认编码方式,对中文处理很不...

  • 解决Python3中的中文字符编码的问题

    Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等。这篇文章主要介绍了Python3中的解决中文字符编码的问题,需要的朋友可以参考下

  • 解决Python3中的中文字符编码的问题-亲测有效

    解决Python3中的中文字符编码的问题 一、原理篇: Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等。这篇文章主要介绍了Python3中的解决中文字符编码的问题,需要的朋友可以参考下...

  • python3默认的字符编码和文件编码_Python3高级—字符集和编码,进阶

    1.Python默认字符和文件编码(1).python3.x 默认的字符编码是Unicode,默认的文件编码是utf-8(2).python2.x 默认的字符编码是ASCII,默认的文件编码是ASCII2.Python字符串编码和解码(1)默认字符串是Unicode类型,该...

  • python 输出中文字符编码_解决python的中文字符编码问题

    关键字:自然语言处理, 字符编码, python1. 从字符编码谈起讲真,字符编码是很大的一块内容,单用一篇博客是完全讲不完的。这里借用一下大佬的文章:字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的日志看完上面...

  • python查看字符编码值_Python 字符编码

    字符串也是一种数据类型,但比较特殊的是字符串存在一个编码问题,也就是我们怎么用计算机来表示相应的字符并存储。在编程语言中,我们经常会处理文本编码之间的转化问题,因为文本可能存在不同的编码,比如 ASCII、...

  • python字符编码

    字符编码

  • 【Python】字符串使用哪种编码格式?

    Python使用哪种字符编码? 概述 这里先举一个例子。古代打仗,击鼓为号、鸣金收兵,即把要传达给士兵的命令对应为公认的其他形式,这就和编码有相似之处。 举个栗子: 以发布进攻命令为例,相比用嗓子喊,敲鼓发出...

  • 〖Python零基础入门篇⑲〗- 字符串的编码格式

    编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控...

  • python3字符集编码、中文编码原理与总结

    python3在编码问题上会涉及到系统默认编码、本地默认编码和ssh工具终端通信编码三大不同层面,三者可以组合出不同的编码情况,不仔细梳理清楚确实容易弄混。本文在最后会给出一个真实的业务案例,若能搞清楚那么解决...

  • python程序采用unicode编码、英文字符_python--基础字符编码

    一 了解字符编码的知识储备一 计算机基础知识二 文本编辑器存取文件的原理(nodepad++,pycharm,word)#1、打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后...

  • python——字符编码

    1、如何解决乱码的情况 ```python #文件当初以什么标准编码,打开的时候就以什么标准解码 ``` &gt; 2、python解释器版本不同带来的编码差异 * 由于Python2...实例如下: ```python s = '我要坚持学python!' #编码 res ...

  • 解决Python3将数据保存为json,中文显示为Unicode编码的问题

    解决Python3将数据保存为json,中文显示为Unicode编码的问题

  • 【python技能树】python编码规范

    想要写好python代码,必须了解python相关编码规范,有了这个的加持,编写的代码不仅可以实现相应的功能,而且简单易读,逻辑清晰。本节技能树主要分享相应的python编码规范,学习python的小伙伴们请仔细阅读,对你的...

  • python 中文字符串 编码转换_Python合集之Python字符串编码转换

    最早的字符串编码是美国标准信息交换码,即ASCII码,他仅对10个数字,26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII码最多只能表示256个符号,每个符号占一个字节。随着信息技术的发展,各国...

  • python3转为unicode编码_Python3的unicode编码转换成中文的问题及解决方案

    [这世界上一定有另一个小编做着小编不敢做的事过着小编想过的生活]前端将中文编码后传到后台,后台对传来的数据进行json.dumps存入mysql数python默认就是unicode存储。如果是从文件读取的,在open的参数中指定...

Global site tag (gtag.js) - Google Analytics