python3中的编码与解码原理

摘要:
2.编码的形式解读首先要熟悉python中出现的编码形式,有时可以根据它的形式来判断这是什么编码'u4e2du6587'就是中文二字对应的Unicode编码b'xe4xb8xadxe6x96x87'就是中文二字对应的utf-8编码b'xd6xd0xcexc4'就是中文二字对应的gbk编码其中u和x都是转义字符,和换行符类似x表示十六进制数,每个x后面跟两位,每一位都是0-9abcdef这16个中的一个。

先看代码

>>> a = '中文'

>>>a

'中文'

>>> print(a)

中文

 

>>> b = 'English'

>>>b

'English'

>>> print(b)

English

解释编码和解码的过程

>>> aa = a.encode('utf-8')
>>>aa
b'xe4xb8xadxe6x96x87'
>>> a.encode('gbk')
b'xd6xd0xcexc4'
>>> aa.decode('utf-8')
'中文' 
>>>type(a)
<class 'str'>
>>>type(aa)
<class 'bytes'>
 >>> 'u4e2du6587''中文'
>>> print('u4e2du6587')
中文 
>>> 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中出现的编码形式,有时可以根据它的形式来判断这是什么编码
'u4e2du6587'就是中文二字对应的Unicode编码
b'xe4xb8xadxe6x96x87'就是中文二字对应的utf-8编码
b'xd6xd0xcexc4'就是中文二字对应的gbk编码
其中u和x都是转义字符,和 换行符类似
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个字节
这个结果和我们之前所说的一个中文字符在各个编码中占字节数相符
再注意到'u4e2du6587'直接输出和print都会出现“中文”二字,进一步说明python3中我们通常说的字符其实就是Unicode,将他们看成完全一样的就好
输出'u4e2du6587'这种转义字符时,是识别了u,自动通过对照表将后面的那串字节显示成了中文
对于b''这种前面有个b的,type都变了,不是str而是bytes,这种在print时会原样输出

免责声明:文章转载自《python3中的编码与解码原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android实现简单的检测手机自由落体关闭屏幕css中max-width和min-width的应用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

asp.net(C#) 编码解码(HtmlEncode与HtmlEncode)

Default.aspx <%@PageValidateRequest="false"Language="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="test_Default"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Tr...

xxl-job 增加python3

xxl-job 项目中,可以定时执行python脚本,但默认都是使用linux系统自带的python2.7执行脚本,与常用且常写的python3不符。本文主要解决这个问题。 解决方案 修改直接修改 com.xxl.job.core.glue.GlueTypeEnum 这个枚举即可。比如我在这个枚举新增了一个python3,既不影响之前的python2.x脚...

Python3.x:pdf2htmlEX(解析pdf)安装和使用

Python3.x:pdf2htmlEX(解析pdf)安装和使用 简介 pdf2htmlEX是一款优秀的pdf转换成html的工具; 下载 windows下载地址:http://soft.rubypdf.com/software/pdf2htmlex-windows-version 安装 下载pdf2htmlEX-win32-0.14.6-with-pop...

python2.7中的字符编码问题

转自:https://www.cnblogs.com/liaohuiqiang/p/7247393.html 0. 写在前面 起因:之前写个数据预处理程序的时候遇到了点问题,用re模块的正则查找方法search时总是找不出来(找错了或者出乱码),于是捣鼓捣鼓。 经过:查资料,做实验,发现用utf8编码的str类型的字符串在search方法中行不通,因为st...

详谈字符编码[二]代码页和一个乱码案例

上一篇关于字符编码的随笔介绍了编码,输入码,机内码,字形码,字形库等概念。除此之外,还有一些其他的概念我们不得不了解,它们已经不属于现在,但是却时常影响着现在。代码页,正是这些有历史感的概念之一。这篇博文带你了解代码页和当前Windows对Unicode和ANSI编码的支持情况,末尾分析了一个乱码的案例,出于某知名软件,你一定不想错过。 Windows的默...

安装pygame

在python3中安装pygame库,(如果没有pip3命令使用 sudo apt-get install python3-pip 安装。)      $ sudo pip3 install pygame 遇到如下问题 Downloading/unpacking pygame Downloading pygame-1.9.1release.tar.gz...