[oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式

简介: [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式

utf-8 回忆上次内容

  • 上次再次输出了大红心<span style="color:red">♥</span>
  • 找到了红心对应的编码
  • 黑红梅方都对应有编码


  • 原来的编码叫做 ascii️
  • \u这种新的编码方式叫unicode
  • 包括了 中日韩字符集等 各书写系统的字符集


  • 但是有个问题
  • 拜这个字
  • 在字节中应该是b"\x62\xdc"两个字节


添加图片注释,不超过 140 字(可选)

  • 该如何理解b"\x62\xdc"这两个字节呢?🤔
  • 究竟是"拜"
  • 还是"bÜ"呢?


添加图片注释,不超过 140 字(可选)

在文件系统中验证

  • 首先进入 vi
  • 然后在插入模式下写一个
  • 点击桌面上的sougo图表
  • 在右下角的键盘位置选择中文
  • 然后就可以输入中文了


添加图片注释,不超过 140 字(可选)

  • :%!xxd

添加图片注释,不超过 140 字(可选)


  • 存储的状态是
  • e4b880
  • 三个字节


  • 并不是unicode对应的
  • 4e00
  • 两个字节



  • 我们还是得区分一下概念

字符集和字符集编码

  • 字符集(Character-Set)是
  • 指的是字符和序号之间的对应关系
  • 函数是
  • ord
  • chr



  • 字符集编码(Character-Set Encoding)
  • 指的是把字符集里面的所有字符
  • 放到计算机的字节里
  • 函数是
  • encode
  • decode



  • ascii、gb2312、BIG5
  • 既是字符集
  • 又是字符编码


添加图片注释,不超过 140 字(可选)

  • unicode如何呢?

unicode

  • 一般来讲unicode是字符集
  • 可以用ord和chr
  • 但Unicode一般不做字符集编码


添加图片注释,不超过 140 字(可选)

  • 用字符集什么来进行字符编码呢?

utf-8

  • utf-8 是一种可变长度的字符编码格式
  • 有的时候 1 字节 利用他省空间
  • 有的时候 2 字节 利用他很平衡
  • 有的时候 3 字节 利用他范围广
  • 再往后 利用的更是他范围广


  • 这不就两方面好处都得到了么
  • utf-8 的意思是
  • Unicode Transformation Format – 8-bit


添加图片注释,不超过 140 字(可选)

  • 这和 unicode 到底有什么区别呢?

存储规则

  • Unicode 是字符集
  • Universal Coded Character Set
  • 字符集:为每一个字符分配一个唯一的数字ID
  • (学名为码位 / 码点 / Code Point / 字符的身份证号)
  • 可以在 https://home.unicode.org/
  • 找到每一个字符的唯一编码



添加图片注释,不超过 140 字(可选)

  • utf-8 是 字符集编码方案
  • Unicode Transformation Format – 8-bit
  • 编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
  • 而且读到字符之后
  • 系统就知道这个到底是几个字节存储的



具体编码

  • 那这个东西怎么具体存储和操作呢?

添加图片注释,不超过 140 字(可选)

  • 一(4E00) 在上图中
  • 属于第三行的范围
  • 从 0800-FFFF
  • 所以三个字节


  • 如下图套入模板

添加图片注释,不超过 140 字(可选)

  • 具体存储的状态呢?

具体字节状态

  • :%!xxd

添加图片注释,不超过 140 字(可选)

  • 说明我们用的确实是utf-8编码
  • 可以解码回来吗?

添加图片注释,不超过 140 字(可选)

  • utf-8 解码 E4B080 转化为 unicode 编码是 4E00
  • 后面的 0a 是 换行LineFeed
  • 或者叫做 NL(NewLine)
  • 如果是两个

动手

  • 两个字符相同的

添加图片注释,不超过 140 字(可选)

  • 得到两个同样的三字节utf-8存储

添加图片注释,不超过 140 字(可选)

  • 以及最后的
  • 0a 依然是 换行LineFeed
  • 或者叫做 NL(NewLine)



  • 可以在反汇编指令层面中看到么?😄

反编译

添加图片注释,不超过 140 字(可选)

  • :%!xxd
  • 转化为字节码状态


添加图片注释,不超过 140 字(可选)

  • 汉字确实可以在字节码状态中观察到

编码解码

  • 第一次编码
  • 把汉字编码为 unicode
  • 具体就是把 编码为 unicode 值 0x4e00这个编号


  • 第二次编码
  • unicode 值编码为 utf-8
  • 具体就是把 unicode 值 0x4e00 编码为 0xe4b880
  • 可以落实到字节里


添加图片注释,不超过 140 字(可选)

  • 第一次解码
  • utf-8 解码为 unicode
  • 具体就是把 utf-8 值 0xe4b880 解码为 0x4e00
  • 把字节还原为序号


  • 第二次解码
  • unicode 解码为汉字
  • 具体就是把 0x4e00 解码为
  • 找到序号对应的字符


  • unicode编码是utf-8存储形式和具体汉字中间的桥梁

验证编码

  • 原始字符串
  • "一"


  • 查看原始字符串utf-8编码
  • "一".encode("utf-8")


  • 给utf-8编码解码
  • b"\xe4\xb8\x80".decode("utf-8")


  • 先编码再解码
  • "一".encode("utf-8").decode("utf-8")


  • 先解码再编码
  • b"\xe4\xb8\x80".decode("utf-8").encode("utf-8")


添加图片注释,不超过 140 字(可选)

  • b"\xe4\xb8\x80"是几个字节的类型呢?

字节序列类

  • 前缀 b 表示 byte 字节
  • 后面的是 bytes类型对应的 字节序列


添加图片注释,不超过 140 字(可选)

  • \x 是前缀
  • b"\xe4\xb8\x80"是三个字节的序列


添加图片注释,不超过 140 字(可选)

默认编码

  • utf-8 是系统默认的编码格式
  • 一般都是这种编码格式


添加图片注释,不超过 140 字(可选)

  • 这一个字符就对应三个字节
  • 可以用长度来描述字符么?


字符长度

  • len()函数
  • 可以衡量出字符串的长度
  • 也可以衡量出编码后字节序列的长度


添加图片注释,不超过 140 字(可选)

  • ascii[0,127] 字符 的长度
  • 就是字节的长度


  • 汉字呢?

汉字

  • 字母a对应着一个字节
  • 汉字对应着三个字节


添加图片注释,不超过 140 字(可选)

  • 这个unicode的编码空间
  • 究竟是怎么安排的呢?


排好座次

添加图片注释,不超过 140 字(可选)

  • 所有unicode字符 被分成了4档
  • ascii
  • 1 字节


  • 后面的字符有可能用
  • 2 字节
  • 3 字节
  • 4 字节



添加图片注释,不超过 140 字(可选)

  • 0开头的
  • ascii
  • 英文字符和数字占据最大范围兼容


  • 10开头的
  • 2 字节
  • 主要是拼音符号文字
  • 拉丁
  • 希腊
  • 西里尔
  • 等等



  • 110开头的
  • 3 字节范围内
  • 首先是印度
  • 然后是杂项
  • 然后是符号
  • 日文假名
  • 然后是中日韩 CJK



  • 11110开头的
  • 4 字节
  • 表情符号emoji😈
  • 各种扩展集


极大扩展

  • unicode字符集 开始逐渐流行
  • utf-8所代表的存储编码也开始流行


  • 一旦一种编码在世界上开始流行
  • 他就会挤压其他的编码方式的生存空间
  • 到了 2020 年 95%的网页使用 unicode 编码
  • 到了 2021 已经达到了 97.4%



  • 感觉这是全球化一体最终的编码方式

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

字符大战终局

  • 关于编码的世界大战

添加图片注释,不超过 140 字(可选)

  • 分久必合
  • 最终的胜利者是unicode和utf-8
  • 他们彼此也可以相互转化

相互转化

  • unicode形式
  • "\u4e00"


  • 把unicode编码按照utf-8编码
  • "\u4e00".encode("utf-8")


  • 先把unicode编码为utf-8,再解码回unicode
  • "\u4e00".encode("utf-8").decode("utf-8")


  • 把utf-8编码解码回unicode编码
  • b"\xe4\xb8\x80".decode("utf-8")


  • 把utf-8编码先解码回unicode编码,再编码为utf-8
  • b"\xe4\xb8\x80".decode("utf-8").encode("utf-8")


  • 曾经掌握了 ascii 码和 ascii 字符的转化方法
  • 也要掌握 unicode 和 utf-8 双向转化的方法

添加图片注释,不超过 140 字(可选)

  • gb2312系列又如何了呢?

gbk的演化

  • 80年的gb2312
  • 95年的gbk
  • 05年有了gb18030

添加图片注释,不超过 140 字(可选)

  • 全称:国家标准 GB 18030-2005《信息技术中文编码字符集》
  • 是中华人民共和国现时最新的内码字集
  • 是 GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版


  • 有多少字符了呢?

字符集

  • GB 18030 与 GB 2312-1980 和 GBK 兼容
  • 共收录汉字<span style="font-size:80px">70244</span>个
  • 与 utf-8 相同
  • 采用多字节编码
  • 每个字可以由 1 个、2 个或 4 个字节组成
  • 编码空间庞大



添加图片注释,不超过 140 字(可选)

  • utf-8标准海纳百川
  • GB18030用的人很少
  • 但始终依然存在


  • GB18030有什么作用呢?😄

乱码问题

  • 有的时候还会遇到 gb18030 编码的文档
  • 用 utf-8编码方式
  • 打开 gb18030编码 的文件
  • 就会乱码


  • 这个时候可以在 vim 中使用命令
  • :edit ++enc=gb18030


  • 可以解决问题

添加图片注释,不超过 140 字(可选)

  • gb18030 用的人少
  • 有用的人少的好处
  • 如果只会用utf-8解码
  • 那么gb18030本身就构成了加密系统
  • 只有懂汉语并且懂编码才能看懂
  • 不懂的话只能见到乱码
  • 想要自动翻译都不行


总结

  • 这次了解了unicodeutf-8
  • unicode是字符集
  • utf-8是一种可变长度的编码方式
  • utf-8是实现unicode的存储和传输的现实的方式


添加图片注释,不超过 140 字(可选)

  • unicode让字符范围得到了极大扩展
  • unicode到底还扩展出什么好玩的字符呢?🤔



目录
相关文章
|
3月前
|
JSON 大数据 API
5个技巧写出专业Python代码:从新手到进阶的实用指南
本文分享5个提升Python代码质量的核心技巧,涵盖命名规范、函数设计、错误处理、代码组织和性能优化,通过实际案例对比展示专业编码实践,助你写出更清晰、可维护的代码。
107 0
|
8月前
|
人工智能 Python
[oeasy]python082_变量部分总结_variable_summary
本文介绍了变量的定义、声明、赋值及删除操作,以及Python中的命名规则和常见数据类型。通过示例讲解了字符串与整型的基本用法、类型转换方法和加法运算的区别。此外,还涉及异常处理(try-except)、模块导入(如math和random)及随机数生成等内容。最后总结了实验要点,包括捕获异常、进制转化、变量类型及其相互转换,并简述了编程中AI辅助的应用策略,强调明确目标、分步实施和逐步巩固的重要性。更多资源可在蓝桥、GitHub和Gitee获取。
280 97
|
8月前
|
人工智能 Python
[oeasy]python089_列表_删除列表项_remove_列表长度_len
本文介绍了Python列表(list)的操作方法,重点讲解了`remove`方法的使用。通过实例演示如何删除列表中的元素,探讨了`ValueError`异常产生的原因,并分析了时间复杂度O(n)的概念。同时提及了`clear`方法清空列表的功能及`len`函数获取列表长度的用法。最后以购物清单为例,展示列表的实际应用场景,并预告快速生成列表的方法将在后续内容中介绍。
273 63
|
7月前
|
存储 索引 Python
[oeasy]python093_find方法_指数为负数_index_实际效果
本文介绍了Python中`find`方法与索引(index)的使用,包括负数索引的实际效果。回顾了`eval`函数的应用,并强调类名如`str`、`int`、`list`不可用作变量名以避免覆盖。通过示例解析了负数索引在字符串和列表中的作用,以及`index`方法的三个参数(value、start、stop)的用法。同时对比了`index`和`find`方法的区别:`index`找不到子串时抛出`ValueError`,而`find`返回-1。最后总结了正负索引的使用场景及两者的特性,提供了相关学习资源链接。
438 8
|
8月前
|
人工智能 索引 Python
[oeasy]python091_列表_索引_index_中括号_索引函数
本文介绍了Python中列表与字符串的索引及index函数用法。通过range生成列表,使用索引[]访问和修改列表元素,index函数查找元素位置。字符串支持索引访问但不可直接修改。还探讨了16进制数在Python中的表示方法,以及日期、月份等特殊字符的Unicode范围。最后总结了列表与字符串操作的区别,并预告后续内容,提供蓝桥云课、GitHub和Gitee链接供进一步学习。
228 20
|
9月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
284 29
|
8月前
|
Python
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
209 17
|
8月前
|
Python 容器
[oeasy]python090_列表_构造_范围_range_start_end_step_步长
本文介绍了Python中列表的生成方法,重点讲解了`range()`函数的使用。通过`range(start, stop, step)`可生成一系列整数,支持正负步长,但不支持小数参数。文章从基础的列表追加、直接赋值到复杂的应用场景(如生成等宽字体的月份列表),结合实例演示了`range()`的灵活性与实用性。最后总结了`range()`的关键特性:前闭后开、支持负数步长,并提供了进一步学习的资源链接。
264 13
|
8月前
|
索引 Python
[oeasy]python092_eval_衡量_转化为列表
本文探讨了 Python 中 `eval` 函数的用法及其与字符串和列表之间的转换关系。通过实例分析,展示了如何使用 `eval` 将字符串转化为对应的数据类型,例如将表示列表的字符串转回列表。同时,文章深入讲解了 `eval` 的工作机制,包括根据本地和全局变量对字符串进行计算的能力。此外,还提醒了命名变量时需避免覆盖内置类名(如 `str`、`int`、`list`)的重要性,以免影响程序正常运行。最后,简要提及字符串和列表索引中负数的应用,并为读者提供了进一步学习的资源链接。
175 2
|
8月前
|
人工智能 Python
[oeasy]python088_列表_清空列表_clear
本文介绍了Python中列表的清空方法`clear`。通过实例讲解了`clear`与将列表赋值为空列表的区别,前者会清空原列表内容,而后者创建新空列表,不影响原列表。文中以收银程序为例,展示了`clear`的实际应用场景,并通过地址观察解释了两者的机制差异。最后总结了相关术语如`list`、`append`、`clear`等,帮助理解列表操作及方法调用的概念。
191 5

推荐镜像

更多