网站首页 > 博客文章 正文
作者 | 天元浪子
责编 | 刘静
出品 | 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)
<class 'str'>
>>> len(s)
7
>>> s
'abc天圆地方'
>>> print(s)
abc天圆地方
>>> s.encode('unicode-escape')
b'abc\\u5929\\u5706\\u5730\\u65b9'
不管是否在字符串前面加了u,只要不在字符串前面使用b,在IDLE中定义的字符串都是Unicode编码,也就是PY3的<class ‘str’>,其长度就是字符数量,不是字节数。我们把Unicode字符串’abc天圆地方’转成UTF8编码:
>>> s_utf8 = s.encode('utf8')
>>> type(s_utf8)
<class 'bytes'>
>>> 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)
<class 'bytes'>
>>> 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 <module>
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】
猜你喜欢
- 2025-05-16 网络技术领域端口号备忘录,受益匪浅 !
- 2025-05-16 实现多态必须满足什么条件
- 2025-05-16 新手小白如何用STM32F103C8T6打造自己的开发板
- 2025-05-16 常见的 Ethernet II 报文类型(EtherType)及其对应的 十六进制值
- 2025-05-16 Unicode,GBK和UTF8
- 2025-05-16 阿波罗 STM32F767 开发板资料连载第四十六章 NAND FLASH 实验
- 2025-05-16 基于c51单片机的智能温度控制系统设计与实现(含代码)
- 2025-05-16 基于msp430单片机1602 DS1802温度显示
- 2025-05-16 CPU缓存一致性:从理论到实战
- 2025-05-16 正点原子STM32F4/F7水星开发板资料连载第四十四章NAND FLASH实验
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)