python3中的编码与解码原理

先看代码

>>> a = ‘中文‘

>>> a

‘中文‘

>>> print(a)

中文

>>> b = ‘English‘

>>> b

‘English‘

>>> print(b)

English

解释编码和解码的过程

>>> aa = a.encode(‘utf-8‘)
>>> aa
b‘\xe4\xb8\xad\xe6\x96\x87‘
>>> a.encode(‘gbk‘)
b‘\xd6\xd0\xce\xc4‘
>>> aa.decode(‘utf-8‘)
‘中文‘
>>> type(a)
<class ‘str‘>
>>> type(aa)
<class ‘bytes‘>
 >>> ‘\u4e2d\u6587
‘‘中文‘
>>> print(‘\u4e2d\u6587‘)
中文
>>> b.encode(‘ascii‘)
b‘English‘
>>> b.encode(‘utf-8‘)
b‘English‘
>>> b.encode(‘gbk‘)
b‘English‘

1.编码与解码

首先要知道python3中涉及到编码与解码的主要只有两个方法:编码encode和解码decode
 编码(encode)过程是将Unicode形式转化为utf-8等其他形式
 解码(decode)过程是将utf-8等其他形式转化为Unicode形式
 这里一定一定要注意,要把Unicode和utf-8等其他形式区分来看待,Unicode自己是一类,其他形式合在一起是一类
 Unicode形式的字符串的type是str,utf-8等其他形式的字符串的type是bytes
 可以理解成Uincode就是我们看到的字符本身,utf-8等其他形式是存储进文件时的格式
 Unicode形式的字符串用print打印出来就是我们看到的字符,其他格式print都是一些16进制数
 在python3中不涉及与文件、网页交互时,不涉及到编码解码,也不会涉及到乱码之类的问题,上面展示的只供学习使用(而python2是涉及的,因此很多人会说弃用py2改用py3就没有编码问题了,说的就是这里)
 python3中a = ‘中文‘这样赋值默认a的编码方式是Unicode,encode之后得到的aa是二进制格式(二进制和16进制本质上是一样的)
 编码和解码过程是这样的:比如一串字符,最初以GBK编码格式存在文件中,我们想将其变成UTF-8编码。需要先用GBK编码将原始的二进制数翻译成字符,即由GBK编码向Unicode编码进行转换,这是解码过程;得到字符之后再去找这些字符在UTF-8编码下对应什么二进制数,这些二进制数就是我们要的结果,这是编码过程,由Unicode向UTF-8编码的转换。所以Unicode相当于一个中介,所有编码的相互转化都要经过它。

2.编码的形式解读

首先要熟悉python中出现的编码形式,有时可以根据它的形式来判断这是什么编码
 ‘\u4e2d\u6587‘就是中文二字对应的Unicode编码
  b‘\xe4\xb8\xad\xe6\x96\x87‘就是中文二字对应的utf-8编码
  b‘\xd6\xd0\xce\xc4‘就是中文二字对应的gbk编码

其中\u和\x都是转义字符,和\n换行符类似
 \x表示十六进制数,每个\x后面跟两位,每一位都是0-9abcdef这16个中的一个。两位共可以表示16*16=256个数,即可以表示2^8=2568位的二进制数可以表示的数。也就是说一个\x可以代表一个字节
 \u表示Unicode编码,一个\u后面接4位的16进制数,每一位也是0-9abcdef这16个中的一个,4位可以表示16位二进制数可以表示的数,所以说一个\u可以代表两个字节
 从字节的角度我们再来看一下这个输出,“中文”两个字
 在Unicode编码中占4个字节
  在utf-8编码中占6个字节
  在gbk编码中占4个字节
  这个结果和我们之前所说的一个中文字符在各个编码中占字节数相符

再注意到‘\u4e2d\u6587‘直接输出和print都会出现“中文”二字,进一步说明python3中我们通常说的字符其实就是Unicode,将他们看成完全一样的就好
 输出‘\u4e2d\u6587‘这种转义字符时,是识别了\u,自动通过对照表将后面的那串字节显示成了中文
 对于b‘‘这种前面有个b的,type都变了,不是str而是bytes,这种在print时会原样输出

原文地址:https://www.cnblogs.com/1208xu/p/12045127.html

时间: 2024-09-29 02:41:19

python3中的编码与解码原理的相关文章

http协议中的编码和解码

http://www.csdn1 2 3.com/html/itweb/20130730/29422_29378_29408.htm ****************************** 一.字符集与文字编码简介 1. 计算机如何显示文字 我们知道,计算机是以二进制的“形式”来保存和处理数据的,也 就是说,不管我们使用键盘进行输入,还是让计算机去读取一个文本文件,计算机得到的原始内容是一些二进制序列,当需要对这些二进制序列进行显示时,计算机 会依照某种“翻译机制”(也就是编码方式),取到

python3中的编码

python2字符串编码存在的问题: 使用 ASCII 码作为默认编码方式,对中文处理不友好 把字符串分为 unicode 和 str 两种类型,将unicode作为唯一内码,误导开发者 python3中默认编码方式修改为utf-8. 在存储和显示上,python3使用文本字符和二进制数据进行区分,更加明确和清晰. 文本字符使用str类型表示,str 能表示 Unicode 字符集中所有字符,而二进制数据使用bytes类型表示. str与bytes之间的转换 一种方式 # bytes objec

【js与jquery】javascript中url编码与解码

本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数 编码/解码 escape / unescape, encodeURI / decodeURI, encodeURIComponent / decodeURIComponent. [js与jquery]javascript中url编码与解码,布布扣,bubuko.com

js和C#中的编码和解码

原文:js和C#中的编码和解码 同一个字符串,用URL编码和HTML编码,结果是完全不同的. JS中的URL编码和解码 encodeURIComponent("text") //url编码 decodeURIComponent("text") //url解码 JS中的HTML编码和解码 escape("text") //html编码 unescape("text") //html解码 C#中的URL编码和解码 HttpUtil

嵌入式媒体处理(EMP)中的编码和解码

我知道,我对与电子有关的所有事情都很着迷,但不论从哪个角度看,今天的现场可编程门阵列(FPGA),都显得"鹤立鸡群",真是非常棒的器件.如果在这个智能时代,在这个领域,想拥有一技之长的你还没有关注FPGA,那么世界将抛弃你,时代将抛弃你.本公众号作者ALIFPGA,多年FPGA开发经验,所有文章皆为多年学习和工作经验之总结. 很多视频压缩算法都存在着竞争,都想获得业界和消费者的认可.它们的出现反映了一种趋势,即从单个设备上专门存储和播放媒体转向所谓流媒体概念,也就是说媒体内容在由无线或

python中base64编码与解码

引言: 在一些项目中,接口的报文是通过base64加密传输的,所以在进行接口自动化时,需要对所传的参数进行base64编码,对拿到的响应报文进行解码: Base64编码是一种"防君子不防小人"的编码方式.广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有"=",生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容易被破解,仅适用于加密非关键信息的场合python2中进行Base64编码和解码&g

python3中的编码问题

一提到编码,我们脑子里就会想到unicode, utf-8 ,gbk 等类型的编码. 但事实上,unicode和utf-8,gbk并不是同一级别的代码. python3中,unicode是内存里统一使用的编码,内存里所有的数据(比如str对象)都是用unicode编码的. 可以看到,添加u前缀以后,str对象没变化,说明原本就是unicode 从unicode编码转换成别的类型的编码,这个过程叫编码 (encode) 从别的类型的编码转换为unicode,这个过程叫解码 (decode) 由此你

Java-IO流之转换流的使用和编码与解码原理

一.理论: 1.字符流和字节流区别是什么? 字符流=字节流+编码集,在实际读取的时候其实字符流还是按照字节来读取,但是会更具编码集进行查找编码集字典解析相应的字节,使得一次读取出一个字符: 2.什么是转换流? 转换流就是原本是字节流,但是读取到的数据是字符,所以我们希望使用字符流来进行操作,那么就可以使用转换流进行转换: 转换流=字节流+编码集. 转换流的特点是可以指定编码集. 3.转换流的作用: (1).从控制台读取数据输入(键盘输入),将它们写入到文件(我们写的是字符吧): (2).当对文件

Python2 和 Python3 中默认编码的差异

最近在使用 Python3.4 做一些脚本实现,发现对于编码的处理上和 Python2.6 有很大的不同,就此机会把相关知识做个梳理,方便需要的时候查阅. 先说下概念和差异: 脚本字符编码:就是解释器解释脚本文件时使用的编码格式,可以通过 # -\*- coding: utf-8 -\*- 显式指定解释器字符编码:解释器内部逻辑过程中对 str 类型进行处理时使用的编码格式Python2 中默认把脚步文件使用 ASCII 来处理(历史原因请 Google)Python2 中字符串除了 str 还