之前一直对python文件中编码解码糊里糊涂,今天看到一篇文章,觉得把我讲的有点明白了。写个心得吧。

1、编码解码是怎么一回事?

Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。

编码是 unicode -> str,相反的,解码就是 str -> unicode。

str形式,也就是字符串形式都是以一定的编码格式存在的,常见的编码格式有utf-8、ASCII、gb2312等等。

str1.decode(‘gb2312’),表示将gb2312编码的字符串str1解码成unicode。

str2.encode(‘utf-8’),表示将unicode字符串str2转换成用utf-8格式编码的字符串。

不同编码格式的字符串之间相互转换编码格式的话,都要先解码成unicode,再编码成其他编码格式的字符串。就拿上面的str1来说,将str1转成utf-8编码的字符串,需要这么做:
str1.decode(‘gb2312’).encode(‘utf-8’)。

2、如何在python文件中指定编码、解码格式呢

我们在编写python脚本的时候,通常在#! /usr/bin/env python下面一行指定该py文件的默认编码格式。比如# coding=utf-8,表示该py文件中的字符串都是以utf-8格式编码的。

而sys.defaultencoding则指明了默认的字符串解码方式。在解码时没有明确指明解码方式的时候使用。

还要记住一点,字符串用什么格式编码,就要用相同的格式解码才能变成unicode。

3、编码解码格式要一致
! /usr/bin/env python
-- coding: utf-8 --
s = '中文' # 这里的 s 是utf-8编码的字符串类型
s.encode('gb18030') 1234

观察上面的代码,我们预计会报错误。因为第二行指定了该py文件里面的字符串默认编码格式是utf-8的,所以s这个字符串就是utf-8编码的字符串。当以gb18030编码格式对s进行解码的时候,将会出错,因为“字符串”

第4句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。因为s本身就是 str 类型的,因此 Python 会自动的先将 s 解码为 unicode,然后再编码成 gb18030。
而当对s进行解码的时候,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是ANSCII,如果 s 不是这个类型就会出错。而我们拿上面的情况来说,我的 sys.defaultencoding 是 anscii,而 s 的编码方式是 utf8 的(因为该py文件的第二行指明了utf-8编码),所以出错了:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position
0: ordinal not in range(128)

对于这种情况,我们有两种方法来改正错误:
一是明确的指示出 s 的解码方式
! /usr/bin/env python
-- coding: utf-8 --
s = '中文'
s.decode('utf-8').encode('gb18030') 1234

二是更改 sys.defaultencoding 为文件的编码方式

import sys

reload(sys)
sys.setdefaultencoding('utf-8')

str = '中文'
str.encode('gb18030')12345678910

这里在调用sys.setdefaultencoding(‘utf-8’) 设置默认的解码方式之前,执行了reload(sys),这是必须的,因为python在加载完sys之后,会删除 sys.setdefaultencoding 这个方法,我们需要重新载入sys,才能调用 sys.setdefaultencoding 这个方法。


本文来自 liuchunming033 博客 ,全文地址请点击:https://blog.csdn.net/liuchunming033/article/details/52223612?utm_source=copy

编码 解码 python的更多相关文章

  1. python 对任意文件(jpg,png,mp3,mp4)base64的编码解码

    程序是事件驱动的,写博客是什么驱动的?事件? 时间?no,我承认我很懒,甚至不愿意记录总结.哪是什么驱动的? 对! 问题驱动的.遇到了问题解决了问题突然想起来搬到blog上,让遇到相同问题的可以参考下 ...

  2. python摸爬滚打之day06----小数据池、编码解码

    1.小数据池 代码块:  一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块.而不需要创建一个新的数据. 这样会节省更多的内存区域. 在cmd命令行 ...

  3. python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: #/usr/bin/env ...

  4. 【10】Python urllib、编码解码、requests、多线程、多进程、unittest初探、__file__、jsonpath

    1 urllib urllib是一个标准模块,直接import就可以使用 1.1get请求 from urllib.request import urlopen url='http://www.nnz ...

  5. Python学习之==>URL编码解码&if __name__ == '__main__'

    一.URL编码解码 url的编码解码需要用到标准模块urllib中的parse方法 from urllib import parse url = 'http://www.baidu.com?query ...

  6. 理解netty对protocol buffers的编码解码

    一,netty+protocol buffers简要说明 Netty是业界最流行的NIO框架之一优点:1)API使用简单,开发门槛低:2)功能强大,预置了多种编解码功能,支持多种主流协议:3)定制能力 ...

  7. day2_python的数据类型,sys,os模块,编码解码,列表,字典

    今天主要了解了python的数据类型,sys,os模块,编码解码,列表,字典 1.数据类型:int(python3没有长整型)文本总是Unicode,str表示二进制用byte类表示布尔型:True( ...

  8. Py3编码解码

    Py3编码解码   写的不好请谅解,有问题欢迎指出.   python2.x中的解决方案(图片来源于网络) #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  9. 编码&解码

    编码与解码首先,明确一点,计算机中存储的信息都是二进制的 编码/解码本质上是一种映射(对应关系):比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示0011 ...

随机推荐

  1. CSS控制图片和文字在同一行显示且对齐的3种方法

    CSS控制图片和文字在同一行显示且对齐的3种方法 在 HTML 代码中,有时会需要在文字旁边加上一个图标. 默认情况,是图片置顶对齐,文字置底对齐,所以通常图片高,文字低,不能水平居中对齐. 常见方法 ...

  2. SGU---104 DP

    题目链接: https://cn.vjudge.net/problem/SGU-104 题目大意: 假设你想以最美观的方式布置花店的橱窗,你有F束花,每束花的品种都不一样,同时,你至少有同样数量的花瓶 ...

  3. BZOJ 1305 dance跳舞 二分+最大流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...

  4. jdk1.5-jdk1.9的主要区别

    jdk1.5相对以前jdk版本主要新增功能 1.自动拆箱和装箱 其中基本数据类型的包装类有:Double,Float,Long,Integer,Short,Character和Boolean 2.提供 ...

  5. shell批量远程连接mysql的方法

    一.配置mysql服务器ip列表如下,可自定义: S1     1.1.1.1     3306 user passwd11   dbname_s1S2      2.2.2.2     3306 u ...

  6. android scheme打开天猫,淘宝

    直接上代码 Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); /* Str ...

  7. istio 配置解读

    Istio在服务网络中统一提供了许多关键功能: 流量管理:控制服务之间的流量和API调用的流向,使得调用更可靠,并使网络在恶劣情况下更加健壮. 可观察性:了解服务之间的依赖关系,以及它们之间流量的本质 ...

  8. Angular动态表单生成(八)

    动态表单生成之拖拽生成表单(下) 我们的动态表单,最终要实现的效果与Form.io的在线生成表单的效果类似,可以参考它的demo地址:https://codepen.io/travist/full/x ...

  9. CANOPEN开发问题

    我是一名研二的学生,现在教研室要开发canopen,我已经看了几个月了,在网上找了canopen的开源代码CANfestival,现在想做移植,有几个问题想要请教:1,开发主站,只买beckhoff的 ...

  10. SpringMVC拓展——利用maven构建springMVC项目

    一.构建项目结构 首先需要构建一个符合目录结构的maven项目 file->new->maven project,勾选 create a simple project->next / ...