百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

一图看懂 Python 2 / Python 3 编码 | CSDN 博文精选

liebian365 2025-03-05 17:46 8 浏览 0 评论

作者 | 天元浪子

责编 | 刘静

出品 | CSDN博客

无论是PY2还是PY3,都使用Unicode作为内存编码,简称内码。保存在Python解释器内存中的文本,输出到屏幕、编辑器,或者保存成文件的时候,都要将内码转换成UTF8或者GBK等编码格式;同样,Python解释器从输入设备接收文本,或者从文件读取文本的时候,都要将UTF8或者GBK等编码转换成Unicode编码格式。因此,无论是PY2还是PY3,想要在Unicode、UTF8、GBK等编码格式之间转换的话,下图是通用的:

我们之所以会产生困惑,是因为PY2和PY3给这些编码格式指定了令人困惑的名字。PY2的字符串有两种类型:Unicode类型和str类型。PY2的Unicode类型就是Unicode编码,PY2的str类型泛指除Unicode编码之外的所有编码,包括ASCII编码、UTF8编码、GBK编码、cp936编码等。PY3的字符串也有两种类型:bytes类型和str类型。PY3的str类型就是Unicode编码,PY3的bytes类型泛指除unicode编码之外的所有编码,包括ASCII编码、UTF8编码、GBK编码、CP936编码等。同样是str类型,在PY2和PY3中完全颠倒了!下图稍微补充了一点内容,更有助于理解编码问题。

接下来,我们实战演练一下。

>>> s = 'abc天圆地方'
>>> type(s)

>>> len(s)
7
>>> s
'abc天圆地方'
>>> print(s)
abc天圆地方
>>> s.encode('unicode-escape')
b'abc\\u5929\\u5706\\u5730\\u65b9'

不管是否在字符串前面加了u,只要不在字符串前面使用b,在IDLE中定义的字符串都是Unicode编码,也就是PY3的,其长度就是字符数量,不是字节数。我们把Unicode字符串’abc天圆地方’转成UTF8编码:

>>> s_utf8 = s.encode('utf8')
>>> type(s_utf8)

>>> len(s_utf8)
15
>>> s_utf8
b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9'
>>> print(s_utf8)
b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9'
>>> s_utf8.decode('utf8')
'abc天圆地方'

UTF8编码就是bytes类型(字节码),长度就是字节数量。我们把Unicode字符串’abc天圆地方’转成GBK编码:

>>> s_gbk= s.encode('gbk')
>>> type(s_gbk)

>>> len(s_gbk)
11
>>> s_gbk
b'abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'
>>> print(s_gbk)
b'abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'
>>> s_gbk.decode('s_gbk')
'abc天圆地方'

GBK编码也是bytes类型(字节码),长度也是字节数量。我们再来看看,不同编码的字节码能否连接:

>>> ss = s_utf8 + s_gbk
>>> ss
b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'
>>> ss.decode('utf8')
Traceback (most recent call last):
File "<pyshell#64>", line 1, in
ss.decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 18: invalid continuation byte
>>> ss.decode('gbk')
'abc澶╁渾鍦版柟abc天圆地方'
>>> ss.decode('utf8', 'ignore')
'abc天圆地方abc'
>>> ss.decode('gbk', 'ignore')
'abc澶╁渾鍦版柟abc天圆地方'

看以看出,不同编码的字节码可以连接,但一般不能解码成Unicode(字符串),除非使用ignore参数。

版权声明:本文为CSDN博主「天元浪子」的原创文章。

想为博主点赞?

想要请教博主?

扫描下方二维码,快速获取与博主直面沟通的方式吧!

【END】

相关推荐

C语言自学课程大纲(c语言入门自学资料)

一、自学C语言,很多人不知道应该如何学习,从哪儿学习,学习又分为几个阶段,总是学着学着就很迷茫???分享C语言的学习路线图,跟着路线图学吧,天天看。...

「linux」定时器方案:红黑树、最小堆和时间轮的原理

一、网络事件和时间事件对于服务端来说,驱动服务端逻辑的事件主要有两个,一个是网络事件,另一个是时间事件;...

程序员怎么会不知道 C10K 问题呢?

昨天的文章中提到了C10K问题,结果好些程序员跑过来问,啥是C10K,我写了这么多年程序,我怎么不知道呢?我说,那你听说过前腿儿猪肉吗?今天简单说说C10K的问题。关于这个问题,Ruby...

朝荐开源 - glib(朝廷百科)

glib是一套通用的实用程序库,它为C语言提供了许多有用的数据结构、工具函数和抽象层,旨在简化C语言的跨平台开发,并提高代码的可重用性和效率。glib是GTK+和GNOME桌面环...

libevent总结(事件处理框架)(libevent libev)

libevent的事件处理框架是一个反应堆模型,而反应堆模型的核心就是io复用,拿epoll来说反应堆模型有两个核心数据结构,一个是epoll维护的内核事件表,一个是保存激活事件的事件队列当然,值得注...

日荐开源 - LibEvent(aldente官网网址)

libevent...

快递单号一键查询,高效追踪包裹物流,省时省力!

在繁忙的现代生活中,快递已成为我们日常生活中不可或缺的一部分。然而,面对众多的快递单号,如何快速、准确地查询包裹的物流信息成为了一个难题。现在,我们为您带来了一款快递单号一键查询工具,让您的物流追踪变...

导入不同快递公司下的单号批量查快递动态,一键解决物流查询难题

看着满屏快递单号陷入沉思?同事小王已经用《快递批量查询高手》一键导入多家快递,批量查询快递信息并统计了…而你还在中通、圆通、申通官网来回切换到鼠标冒烟?是时候亮出这个让快递公司接口“集体颤抖”的...

一键解锁快递查询高效能:批量查询快递,智能排序延误单号

当你的客服团队还在用5个浏览器轮番刷新物流页面时,隔壁仓库的王叔已经用快递批量查询高手把多个个滞留件变成会说话的预警红点!这篇教程将揭秘物流圈的「神器」,让「未更新快递」自动排队到你面前认罪。1.在软...

一站式快递单号查询平台,修改单号刷新快递信息的快递查询教程

一站式快递单号查询平台,支持导入单号查询时修改快递单号,高效刷新快递信息的快递查询教程随着电子商务的繁荣发展,快递业务量不断增长,无论是电商卖家还是普通消费者,对快递信息的查询和管理需求都日益增强。为...

高效快递单号查询,批量查询快递信息,多种查看方式满足你的需求

最近有很多朋友在问,如何查快递,怎么根据条件查看单号呢?不知道如何操作的宝贝们,下面请随小编一起来试试,希望能给大家带来帮助。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?步骤1:运...

物流查询达人必备!一键批量查询快递单号,根据发出时间筛选单号

嘿,各位快递查询达人们,是不是经常为海量的快递单号查询而头疼不已?想要一款能够在线批量查询快递动态,还能根据发出物流时间一键筛选所需快递单号信息的神器吗?来来来,让我给你们揭秘一款快递批量查询高手软件...

快递查询神器,多单号导入,筛选保存一键完成

当面对如山的快递单号,你是否曾感到手足无措?每一个单号都需要你逐一输入、查询,再逐个根据时间差进行筛选,这样的工作无疑是对耐心与精力的双重考验。但别担心,今天,我们将为你揭示一款物流行业的秘密武器——...

快递单号查询神器:一键复制粘贴,轻松批量追踪同公司快递

嘿,小伙伴们!还在为手动输入快递单号查询物流信息而烦恼吗?是不是觉得每次都要一个个输入单号,既费时又费力?别急,今天我要给大家介绍一款神奇的软件——快递批量查询高手!这款软件就像你的私人快递助手一样,...

快递单号查询入口自动批量查询快递动态并根据派件员字段排序单号

想象一下,面对堆积如山的快递单号,你不再需要一个个手动输入查询,而是轻轻一点,就能瞬间掌握所有快递的物流动态,甚至还能根据派件员智能排序,让管理变得井井有条。这不再是遥不可及的梦想,快递批量查询高手软...

取消回复欢迎 发表评论: