[oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式
utf-8
回忆上次内容
\u
这种新的编码方式叫unicode- 包括了 中日韩字符集等 各书写系统的字符集
- 拜这个字
- 在字节中应该是b"\x62\xdc"两个字节
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico](https://file.cfanz.cn/uploads/png/2023/04/06/2/8a4H317d51.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_02](https://file.cfanz.cn/uploads/png/2023/04/10/10/HPT1XfA9e6.png)
在文件系统中验证
- 点击桌面上的sougo图表
- 在右下角的键盘位置选择中文
- 然后就可以输入中文了
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_03](https://file.cfanz.cn/uploads/png/2023/04/10/10/fa9G2JNaOL.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_04](https://file.cfanz.cn/uploads/png/2023/04/10/10/fa8cUaFC0W.png)
字符集和字符集编码
- 字符集编码(Character-Set Encoding)
- 指的是把字符集里面的所有字符
- 放到计算机的字节里
- 函数是
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_05](https://file.cfanz.cn/uploads/png/2023/04/02/1/ab3B124965.png)
unicode
- 可以用ord和chr
- 但Unicode一般不做字符集编码
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_06](https://file.cfanz.cn/uploads/png/2023/04/10/10/DASXY4a587.png)
utf-8
- 有的时候 1 字节 利用他省空间
- 有的时候 2 字节 利用他很平衡
- 有的时候 3 字节 利用他范围广
- 再往后 利用的更是他范围广
- Unicode Transformation Format – 8-bit
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_07](https://file.cfanz.cn/uploads/png/2023/04/10/10/eX2Za4V19e.png)
存储规则
- Universal Coded Character Set
- 字符集:为每一个
字符
分配一个唯一的数字ID
- (学名为码位 / 码点 / Code Point / 字符的身份证号)
- 可以在 https://home.unicode.org/
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_08](https://file.cfanz.cn/uploads/jpeg/2023/04/10/10/21f1G84Af7.jpeg)
- Unicode Transformation Format – 8-bit
- 编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
- 而且读到字符之后
具体编码
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_09](https://file.cfanz.cn/uploads/png/2023/04/10/10/GIcP9WRa92.png)
- 属于第三行的范围
- 从 0800-FFFF
- 所以三个字节
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_10](https://file.cfanz.cn/uploads/png/2023/04/10/10/456844de64.png)
具体字节状态
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_11](https://file.cfanz.cn/uploads/png/2023/04/10/10/fa8cUaFC0W.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_12](https://file.cfanz.cn/uploads/png/2023/04/10/10/008T13R40L.png)
- utf-8 解码 E4B080 转化为 unicode 编码是 4E00
- 后面的
0a
是 换行LineFeed
- 或者叫做
NL(NewLine)
- 如果是两个
一
呢
动手
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_13](https://file.cfanz.cn/uploads/png/2023/04/10/10/QN843F8615.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_14](https://file.cfanz.cn/uploads/png/2023/04/10/10/c8afd42PZ9.png)
反编译
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_15](https://file.cfanz.cn/uploads/png/2023/04/10/10/LK15fDUe81.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_16](https://file.cfanz.cn/uploads/png/2023/04/10/10/Tc893BXEQ8.png)
编码解码
- 把汉字编码为
unicode
- 具体就是把
一
编码为 unicode 值 0x4e00
这个编号
- 把
unicode
值编码为 utf-8
值 - 具体就是把 unicode 值
0x4e00
编码为 0xe4b880
- 可以落实到字节里
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_17](https://file.cfanz.cn/uploads/png/2023/04/10/10/Q67fcNU6O1.png)
- 把
utf-8
解码为 unicode
- 具体就是把 utf-8 值
0xe4b880
解码为 0x4e00
- 把字节还原为序号
- 把
unicode
解码为汉字 - 具体就是把
0x4e00
解码为 一
- 找到序号对应的字符
- unicode编码是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")
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_18](https://file.cfanz.cn/uploads/png/2023/04/10/10/TZ379WS7fb.png)
- b"\xe4\xb8\x80"是几个字节的类型呢?
字节序列类
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_19](https://file.cfanz.cn/uploads/png/2023/04/10/10/7Q8adHIaI8.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_20](https://file.cfanz.cn/uploads/png/2023/04/10/10/G4W4e899eG.png)
默认编码
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_21](https://file.cfanz.cn/uploads/png/2023/04/10/10/V091AXY65F.png)
字符长度
- 可以衡量出字符串的长度
- 也可以衡量出编码后字节序列的长度
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_22](https://file.cfanz.cn/uploads/png/2023/04/10/10/70e2Q6Obf5.png)
汉字
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_23](https://file.cfanz.cn/uploads/png/2023/04/10/10/11Q8c2828R.png)
排好座次
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_24](https://file.cfanz.cn/uploads/png/2023/04/10/10/fDbIfa1f28.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_25](https://file.cfanz.cn/uploads/png/2023/04/10/10/GIcP9WRa92.png)
- 首先是印度
- 然后是杂项
- 然后是符号
- 日文假名
- 然后是中日韩 CJK
极大扩展
- 到了 2020 年 95%的网页使用 unicode 编码
- 到了 2021 已经达到了 97.4%
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_26](https://file.cfanz.cn/uploads/png/2023/04/10/10/218c6ca4f0.png)
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ico_27](https://file.cfanz.cn/uploads/png/2023/04/10/10/db54c361Wd.png)
- https://w3techs.com/technologies/overview/character_encoding
字符大战终局
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_28](https://file.cfanz.cn/uploads/png/2023/04/10/10/6218EaVb1P.png)
- 分久必合
- 最终的胜利者是unicode和utf-8
- 他们彼此也可以相互转化
相互转化
- 先把unicode编码为utf-8,再解码回unicode
- "\u4e00".encode("utf-8").decode("utf-8")
- 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 双向转化的方法
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_29](https://file.cfanz.cn/uploads/png/2023/04/10/10/0CbN67650d.png)
gbk的演化
- 80年的gb2312
- 95年的gbk
- 05年有了gb18030
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_编码方式_30](https://file.cfanz.cn/uploads/png/2023/04/10/10/eCJ0383W7D.png)
- 全称:国家标准 GB 18030-2005《信息技术中文编码字符集》
- 是中华人民共和国现时最新的内码字集
- 是 GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版
字符集
- GB 18030 与 GB 2312-1980 和 GBK 兼容
- 采用多字节编码
- 每个字可以由 1 个、2 个或 4 个字节组成
- 编码空间庞大
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_31](https://file.cfanz.cn/uploads/png/2023/04/10/10/3bIaU6W3Sb.png)
乱码问题
- 用 utf-8编码方式
- 打开 gb18030编码 的文件
- 就会乱码
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_32](https://file.cfanz.cn/uploads/png/2023/04/10/10/LE25DS1fc7.png)
- 有用的人少的好处
- 如果只会用utf-8解码
- 那么gb18030本身就构成了加密系统
- 只有懂汉语并且懂编码才能看懂
- 不懂的话只能见到乱码
- 想要自动翻译都不行
总结
unicode
是字符集utf-8
是一种可变长度的编码方式utf-8
是实现unicode
的存储和传输的现实的方式
![图片描述 [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式_ci_33](https://file.cfanz.cn/uploads/png/2023/04/10/10/eee8G5fTD1.png)
- 我们下次再说!👋
- github->https://github.com/overmind1980/oeasy-python-tutorial
- gitee->https://gitee.com/overmind1980/oeasypython