注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

Python字符编码学习

Python编程 彭东稳 5319次浏览 已收录 0个评论

如果想搞清楚python的字符编码那么首先要明白计算机的字符编码如ASCII、Unicode、UTF-8等等字符编码之间的关系;还有字符编码的组成以及作用,这里就不细说了。看这篇文章:【Python3】Python的字符编码

一、Python字符串

计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为”编码”;反之,将存储在计算机中的二进制数解析显示出来,称为”解码”。

因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串’ABC’在Python内部都是ASCII编码的。Python提供了ord()和chr()函数,可以把字符和对应的二进制相互转换。

在Python 2时代,还是将 strings 处理为原生的 bytes 类型,而不是 unicode(Python 3已经把 string 处理成 unicode)。

可以看到Python 2中 strings 等同于 bytes 类型。

Python后来添加了对unicode的支持,以unicode表示的字符串用U’…’表示。

也可以通过decode方法编码成unicode,只针对Python 2。

经过unicode编码后,写 u'中'u'\u4e2d'是一样的,\u后面是十六进制的Unicode码。因此, u'A'u'\u0041'也是一样的。

到了Python 3后,默认str就是unicode,当程序执行时,无需加u,str也会被以unicode形式保存新的内存空间中,str可以直接encode成任意编码格式,s.encode(‘utf-8′),s.encode(‘gbk’)。

所以在Python 3中自然移除了decode方法,字符串就是unicode,所以不需要进行编码操作了。

Python 2中两种字符串如何相互转换?

字符串’xxx’虽然是ASCII编码,但也可以看成是UTF-8编码,而u’xxx’则只能是Unicode编码。把u’xxx’转换为UTF-8编码的’xxx’用encode(‘utf-8′)方法。

英文字符转换后表示的UTF-8的值和Unicode值相等(但占用的存储空间不同),而中文字符转换后1个Unicode字符将变为3个UTF-8字符,你看到的\xe4就是其中一个字节,因为它的值是228。

二、Python中文编码

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,当你这么执行./test.py程序时,会依赖这个注释。Windows系统会忽略这个注释。

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

Python 2文件中如果未指定编码,在执行过程会出现报错:

以上程序执行输出结果为:

前面介绍了Python 2中默认的编码格式是ASCII格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。

所以在开头加上# -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了,如下:

以上程序输出结果:

所以在写Python 2的过程中,代码中包含中文,就需要在头部指定编码。但是如果是Python 3就不需要了,直接可以执行。

如果你使用Pycharm进行编写代码,除了要加上# -*- coding: utf-8 -*-外,中文字符串必须是Unicode字符串。

三、Python2和Python3的一些不同

  • Python2中默认使用ascii,Python3中默认使用utf-8。
  • Python2中,str就是编码后的bytes,str=bytes,所以str只能decode(编码)。
  • Python3中的字符串与Python2中的u’字符串’,都是unicode,只能encode(解码),所以无论如何打印都不会乱码。因为可以理解为从内存打印到内存,即内存->内存,unicode->unicode。
  • Python3中,str是unicode,当程序执行时,无需加u,str也会被以unicode形式保存新的内存空间中,str可以直接encode成任意编码格式,s.encode(‘utf-8′),s.encode(‘gbk’)。

虽然Python 3源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定UTF-8编码。但是如果你在Windows平台下使用编辑器(Windows终端编码为gbk,Linux是UTF-8),同时需要设置py文件存储的格式为UTF-8。

Pycharm设置步骤:

  • 进入file > Settings,在输入框搜索encoding。
  • 找到Editor > File encodings,将IDE Encoding和Project Encoding设置为utf-8。

四、补充

Unicode:包容万国,优点是字符->数字的转换速度快,缺点是占用空间大。

UTF-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示。

所以一般在内存中使用的编码是unicode,用空间换时间,为了快。因为程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快。但硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。因为数据的传输,追求的是稳定,高效,数据量越小数据传输就越靠谱,于是都转成utf-8格式的,而不是unicode。

如下图:

Python字符编码学习

<参考>

了解python中bytes,str和unicode的区别

https://mp.weixin.qq.com/s/ImVH-XZk5RyjT8D7aMCmZw


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)or分享 (0)
关于作者:

您必须 登录 才能发表评论!