python关于字符编码的基本操作
字符编码
(注意:关于字符编码,如果没有特殊业务要求,请牢记仅使用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编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
最新文章
- nginx笔记资料
- php 升级php5.5
- C++标准库异常类
- SAP标准教材列表
- 一个urllib2构建的html下载器的代理组件的实现方案
- 武汉科技大学ACM:1004: 零起点学算法36——3n+1问题
- JavaScript原生对象拓展
- 【Android Developers Training】 58. 缓存位图
- DIY 温控烙铁
- Docker commit 命令保存的镜像文件太大的问题
- python基础----1. globals和locals
- Visual Studio 2017中使用Libman管理客户端库
- 减小delphi体积的方法
- WebMvcConfigurerAdapter已过时
- Jsoup的学习
- 群晖NAS的Docker容器使用中国镜像加速
- angular学习笔记(九)-css类和样式2
- mybatis逆向工程的注意事项:mapper文件内容不是覆盖而是追加
- 基于angularJS的表单验证练习
- go-007-条件语句
热门文章
- JAVA集合框架 - Collection
- springboot 之 根据传入参数进行多数据源动态切换
- C++中i++和++i的区别
- 在执行 pip install 时遇到错误:python setup.py egg_info ...
- 基于git的博客(含站点与小程序)
- (四)ELK Logstash filter
- python爬京东(带GUI)
- PE文件格式详解(六)
- MyBatis源码分析(二)
- Jetbranis学习资料之全家桶