当前位置: 首页 > news >正文

【Python学习笔记】字符编码

1. 字符串编码

Python3语言里面的字符串对象是unicode字符串,在内存中实际存储时,使用的是 UTF16 编码。但通常不会将UTF16编码的内容写到磁盘或者在网络进行传输, 因为utf16编码比较浪费空间。特别是如果文字信息基本都是英文符号的情况下, utf16 都会用2个字节来代表英文符号。 一个字节其实就够了。

所以,Python语言要对字符串对象 进行存储和传输的时候,通常要使用字符串的encode方法,参数指定编码方式,编码为一个 bytes 对象。

bytes对象的底层就是用一个个的字节来存储字符串中的文字的。

同样的字符串,用不同的编码方式,有时会产生不同的bytes结果。

比如

print ('你好'.encode('utf8')) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
print ('你好'.encode('gbk'))  # 输出 b'\xc4\xe3\xba\xc3'

输出内容 中 b 开头,表示这是一个 字节串bytes 对象

\x 说明是用16进制表示一个字节

你好 两个字,使用 utf8 编码 后的字节串,用16进制来表示就是6个字节 e4bda0 e5a5bd

e4bda0 对应 你
e5a5bd 对应 好

你好 两个字,使用 gbk 编码 后的字节串,用16进制来表示 却是4个字节 c4e3 bac3

c4e3 对应 你
bac3 对应 好

encode方法返回的是编码后的字节串对象bytes 编码为字节串对象 bytes 就可存储到文件或者传输到网络中去了。

2. 字节串解码

当我们的Python程序从文件中读入文字信息, 从网络上接收文字信息,获取的数据通常是使用某种字符编码后的 字节串。程序通常需要解码,这样才方便程序理解和处理字符信息。

Python语言的解码都是解码成 unicode字符串对象。

要解码字节串,必须要知道这个字节串是用什么字符编码的方式进行编码的。

如果知道了,就可以用字节串对象的decode方法进行解码,参数指定了编码方式

比如

print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8'))
print(b'\xc4\xe3\xba\xc3'.decode('gbk'))

上面的两行代码都可以解码出 字符串 ‘你好’

3. 一些字符编解码技巧

unicode数字转换为字符

把 unicode数字转换为字符, 使用函数 chr() , 比如:

>>> chr(50)
'2'
>>> chr(20013)
'中'
>>> chr(0x4e2d)  # 0x开头表示数字是16进制
'中'

字符转换为unicode数字

反过来,要把 字符转换为对应的unicode数字,使用函数 ord()

该函数参数字符串里面只能有一个字符

>>> ord('2')
50
>>> ord('中')
20013

字符串编码为 unicode转义数字

除了utf8,gbk 还有一种常见的编码方式,叫做 unicode-escape ,就是直接用unicode数字字符串表示字符,如下所示

print('一二三四'.encode('unicode-escape'))
$ python main.py
b'\\u4e00\\u4e8c\\u4e09\\u56db'

用unicode转义数字写字符串

print('\u4e00\u4e8c\u4e09\u56db')
$ python main.py
一二三四

字节串 和 16进制表示字节的字符串

>>> a = b'hello,123'
>>> a.hex()
'68656c6c6f2c313233'

反向操作,把 16进制表示字节的字符串 转化为 字节串就是

>>> bytes.fromhex('68656c6c6f2c313233')
b'hello,123'
http://www.lryc.cn/news/207081.html

相关文章:

  • 华为昇腾NPU卡 大模型LLM ChatGLM2模型推理使用
  • Git 拉取远程更新报错
  • 腾讯云国际站服务器端口开放失败怎么办?
  • 一句话解释什么是出口IP
  • 深入理解强化学习——强化学习的历史:试错学习
  • 分享一个用HTML、CSS和jQuery构建的漂亮的登录注册界面
  • Java学习 习题 1.
  • 第六节——Vue中的事件
  • 设置GridView单选
  • [Python从零到壹] 七十二.图像识别及经典案例篇之OpenGL入门及绘制基本图形和3D图
  • 论文-分布式-并发控制-Lamport逻辑时钟
  • 长三角实现区块链电子医疗票据互联互通,蚂蚁链提供技术支持
  • Redis快速上手篇(三)(事务+Idea的连接和使用)
  • Spring三级缓存解决循环依赖问题
  • Unity 中使用波浪动画创建 UI 图像
  • 支付功能测试用例测试点?
  • HFS 快速搭建 http 服务器
  • 学生专用台灯怎么选?双十一专业学生护眼台灯推荐
  • Go 常用标准库之 fmt 介绍与基本使用
  • antv/x6 导出图片方法exportPNG
  • Decomposed Meta-Learning for Few-Shot Named Entity Recognition
  • C++经典面试题:内存泄露是什么?如何排查?
  • Hadoop+Hive+Spark+Hbase开发环境练习
  • 使用Spring Boot限制在一分钟内某个IP只能访问10次
  • ES 数据迁移最佳实践
  • C++中低级内存操作
  • Linux硬盘大小查看命令全解析 (linux查看硬盘大小命令)
  • 什么是供应链金融?
  • Qt之实现支持多选的QCombobox
  • 【UI设计】Figma_“全面”快捷键