编码 解码 python

之前一直对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

原文地址:https://www.cnblogs.com/zjj-tiantian/p/9738731.html

时间: 2024-10-06 11:24:18

编码 解码 python的相关文章

常见编码解码脚本

在平时我们会遇到各种各样的编码,在这里,我总结了一些常见的编码,并不是很全 尝试着做了个编码解码的汇总,并且写了个脚本出来,由于python功底不是很强,所以可能会有不到之处,还望各位多多指正 附上脚本: 1 #-*-coding:utf-8-*- 2 #author:hell0_w 3 #本人博客:http://hell0w.cnblogs.com/ 4 5 import base64 6 import bubblepy 7 import urllib 8 import quopri 9 im

linux之系统编码,python编码,文件编码

1     前言 如果你对python2和python3的中编解码很清楚,这里我认为你很清楚. 具体参考文档: "python2 encode和decode函数说明.docx" "字符编码--从ASCII开始.docx" 以上所有文档均为本地文档. 2     Python编码 sys.getdefaultencoding(): 获取系统当前编码,这里的系统指的是python自己的内置系统,并非操作系统,即3中的python编码. sys.setdefaultenc

理解netty对protocol buffers的编码解码

一,netty+protocol buffers简要说明 Netty是业界最流行的NIO框架之一优点:1)API使用简单,开发门槛低:2)功能强大,预置了多种编解码功能,支持多种主流协议:3)定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展:4)性能高,通过与其它业界主流的NIO框架对比,Netty的综合性能最优:5)成熟.稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼:6)社区活跃,版本迭代周期短,发现的BUG可以

day8_文件操作及编码解码

一.文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统.操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来. 有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的

python2和python3编码解码详解

今天让我们一起彻底揭开py编码的真相,包括py2和py3.有同学可能问:以后py3是大势所趋,还有必要了解py2那令人头疼的编码吗?答案是太有必要啦.py2在生产中还是中流砥柱. 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为"明文"(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英文单词都算作明文. 其次,我们需要能将明文表示的消息转成另外某种表示,我们还需要能将编码文本转回成明文.从明文到编

Python8_关于编码解码和utf-8

关于编码:ASCII码是早期的编码规范,只能表示128个字符.7位二进制数表示 扩展ASCII码,由于ASCII码不够用,ASCII表扩充到256个符号,不同的国家有不同的标准:8位二进制数 Unicode 准确来说不是编码格式,而是字符集.这个字符集包含了世界上所有的符号所有字符长度统一用16位表示,因此字符是定长的: GB2312 在ASCII码表的基础上,小于127的字符意义与原来相同,而将大于127的字节连在一起,表示汉字前一个字节从0xA1(161)到0xF7(247)共87个,称为高

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

服务器端获取表单数据的编码解码问题(servlet)

首先需要明确指出的是,这里的服务器是指tomcat. 在页面没有明确指定编码的情况下,客户端通过input标签和字符串向服务器传递两个值param1和param2.如果直接使用request.getParameter()方法来获取值的话,得到的肯定都是乱码,我们需要对其重新进行编码解码,就像下面的代码所示的那样: new String(req.getParameter("param1").getBytes("iso-8859-1"), "gbk"

百度移动版的url编码解码代码

1 var decode = function(m) { 2 try { 3 m = decodeURIComponent(m); 4 } catch(e) {} 5 var s = m.split("%"); 6 if (s.length > 1) { 7 s.shift(); 8 for(var i = 0; i < s.length; i++) { 9 var t = s[i]; 10 t = parseInt(t, 16); 11 t = t + 256; 12 t