Skip to content

Latest commit

 

History

History
286 lines (208 loc) · 8.11 KB

48-92423-utf-8.sy.md

File metadata and controls

286 lines (208 loc) · 8.11 KB
show version enable_checker
step
1.0
true

utf-8

回忆上次内容

  • 数字字符编码从博多码到 ascii8859各自割据
  • 如何把世界上各种字符统进行编码
    • unicode顺势而生不断进化
    • 不过字符总量超过了65536
    • 2个字节放不下

图片描述

图片描述

  • 究竟应该用几个字节理解存储的这些字节呢?🤔
    • 1字节 省空间 可是范围窄
    • 2字节 居中
    • 3字节 费空间 可是范围广

utf-8

  • utf-8 是一种可变长度的字符编码格式
    • 有的时候 1 字节 利用他空间小
    • 有的时候 3 字节 利用他范围广
  • 这不就两个好处都得到了么
  • utf-8 的意思是 Unicode Transformation Format – 8-bit
  • 这和 unicode 到底有什么区别呢?

图片描述

存储规则

  • Unicode 是字符集编码
    • Universal Coded Character Set
    • 字符集:为每一个字符分配一个唯一的数字ID
    • (学名为码位 / 码点 / Code Point / 字符的身份证号)
    • 可以在 https://home.unicode.org/ 找到每一个字符的唯一编码
  • utf-8 是 编码规则
    • Unicode Transformation Format – 8-bit
    • 编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
    • 而且读到字符之后,系统就知道这个到底是几个字节存储的

图片描述

具体编码

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

图片描述

  • 一(4E00) 属于第三行的范围
  • 从 0800-FFFF
  • 所以三个字节
  • 如下图套入模板

图片描述

在文件系统中验证

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

图片描述

  • :%!xxd

图片描述

  • 字存储的状态确实是 e4b880
  • utf-8 编码 E4B080 转化为 unicode 编码是 4E00

图片描述

  • 后面的 0a 是 换行LineFeed
  • 或者叫做 NL(NewLine)
  • 如果是两个

动手

  • 两个字符相同的

图片描述

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

图片描述

  • 以及最后的
  • 0a 是 换行LineFeed
  • 或者叫做 NL(NewLine)
  • 可以在指令层面中看到么?

反编译

图片描述

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

图片描述

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

编码解码

  • 第一次编码
    • 把汉字编码为 unicode
    • 具体就是把 编码为 unicode 值 0x4e00
  • 第二次编码
    • unicode 值编码为 utf-8
    • 具体就是把 unicode 值 0x4e00 编码为 0xe4b880
  • 第一次解码
    • 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")

图片描述

  • b"\xe4\xb8\x80"是什么类型呢?

字节序列类

图片描述

  • 前缀 b 表示 byte 字节
  • 后面字符串是 bytes 类型对应的字节
  • \x 是前缀
  • b"\xe4\xb8\x80"是三个字节的序列

图片描述

默认编码

图片描述

  • utf-8 是系统默认的编码格式
  • 一般都是这种编码格式
  • 这一个字就有三个字节
  • 可以用长度来描述字符么?

字符长度

图片描述

  • len()函数
    • 可以衡量出字符串的长度
    • 也可以衡量出编码后字节的长度
  • 字母a对应着一个字节
  • 汉字对应着三个字节
  • 这个区间究竟是怎么安排的呢?

排好座次

图片描述

  • 这样的话所有字符被分成了 4 档
  • 1 字节部分 ascii
  • 后面的字符有可能用 2 字节、3 字节、4 字节

图片描述

  • 0开头的
    • ascii
    • 英文字符和数字占据最大范围兼容
  • 10开头的
    • 2 字节
    • 主要是拼音符号文字
      • 拉丁
      • 希腊
      • 西里尔
      • 等等
  • 110开头的
    • 3 字节范围内
      • 首先是印度
      • 然后是杂项
      • 然后是符号
      • 日文假名
      • 然后是中日韩 CJK
  • 11110开头的
    • 4 字节
    • 各种扩展集

极大扩展

  • unicode 开始逐渐流行
  • 一旦一种编码在世界上开始流行
  • 他就会挤压其他的编码方式的生存空间
  • 到了 2020 年 95%的网页使用 unicode 编码
  • 到了 2021 已经达到了 97.4%
  • 感觉这是全球化一体最终的编码方式

图片描述

图片描述

gbk的追赶

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

图片描述

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

字符集

  • GB 18030 与 GB 2312-1980 和 GBK 兼容
  • 共收录汉字70244
  • 与 utf-8 相同
    • 采用多字节编码
    • 每个字可以由 1 个、2 个或 4 个字节组成
    • 编码空间庞大
  • 整个世界还是以utf-8为方向发展的
  • 世界标准放眼世界、放眼未来
    • 不谋万世者
    • 不足谋一时
    • 不谋全局者
    • 不足谋一域
  • 不过这样也挺好的
    • 只有我们自己用的解码方式
    • 其实就成了一种密码😄

乱码问题

  • 有的时候还会遇到 gb2312 编码的文档
  • 有的时候用 utf-8编码方式 打开 gb18030编码 的文件就会乱码
  • 这个时候可以在 vim 中使用命令
  • :edit ++enc=gb18030
  • 可以解决问题

图片描述

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

总结

图片描述

  • utf-8是一种可变长度的编码方式
  • utf-8是实现unicode的存储和传输的现实的方式
  • 这个unicode让字符范围得到了极大扩展
  • 到底扩展出什么好玩的字符呢?🤔
  • 我们下次再说!👋