字符编码

(注意:关于字符编码,如果没有特殊业务要求,请牢记仅使用UTF-8编码)

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

Python对bytes类型的数据用带b前缀的单引号或双引号表示:

x = b'ABC'

要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

如果bytes中包含无法解码的字节,decode()方法会报错:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte

如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'

len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数在操作字符串时,我们经常遇到str和bytes的互相转换。

为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

文本文件设置utf-8读取

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。

当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

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

最新文章

  1. nginx笔记资料
  2. php 升级php5.5
  3. C++标准库异常类
  4. SAP标准教材列表
  5. 一个urllib2构建的html下载器的代理组件的实现方案
  6. 武汉科技大学ACM:1004: 零起点学算法36——3n+1问题
  7. JavaScript原生对象拓展
  8. 【Android Developers Training】 58. 缓存位图
  9. DIY 温控烙铁
  10. Docker commit 命令保存的镜像文件太大的问题
  11. python基础----1. globals和locals
  12. Visual Studio 2017中使用Libman管理客户端库
  13. 减小delphi体积的方法
  14. WebMvcConfigurerAdapter已过时
  15. Jsoup的学习
  16. 群晖NAS的Docker容器使用中国镜像加速
  17. angular学习笔记(九)-css类和样式2
  18. mybatis逆向工程的注意事项:mapper文件内容不是覆盖而是追加
  19. 基于angularJS的表单验证练习
  20. go-007-条件语句

热门文章

  1. JAVA集合框架 - Collection
  2. springboot 之 根据传入参数进行多数据源动态切换
  3. C++中i++和++i的区别
  4. 在执行 pip install 时遇到错误:python setup.py egg_info ...
  5. 基于git的博客(含站点与小程序)
  6. (四)ELK Logstash filter
  7. python爬京东(带GUI)
  8. PE文件格式详解(六)
  9. MyBatis源码分析(二)
  10. Jetbranis学习资料之全家桶