Skip to content

Latest commit

 

History

History
194 lines (147 loc) · 5.44 KB

320-92423-000220 utf-8.sy.md

File metadata and controls

194 lines (147 loc) · 5.44 KB
show version enable_checker
step
1.0
true

utf-8

回忆上次内容

  • 数字字符编码从博多码ascii8859-1各自割据
  • 如何把世界上各种字符统进行编码
  • unicode顺势而生不断进化
  • 不过数量超过了65536
    • 2个字符放不下
  • 究竟应该用几个字节理解存储的这些字节呢?🤔
    • 1字节 省空间 可是范围窄
    • 3字节 非空间 可是范围广

utf-8

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

存储规则

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

图片描述

具体编码

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

图片描述

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

图片描述

在文件系统中验证

  • 首先进入vi
  • 然后在插入模式下写一个
  • :%!xxd

图片描述

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

图片描述

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

编码解码

  • 第一次编码
    • 把汉字编码为 unicode
    • 具体就是把 编码为unicode值 0x4e00
  • 第二次编码
    • unicode 值编码为 utf-8
    • 具体就是把 unicode值 0x4e00 编码为 0xe4b880
  • 第一次解码
    • utf-8 解码为 unicode
    • 具体就是把 utf-8 值 0xe4b880 解码为 0x4e00
  • 第二次解码
    • unicode 解码为汉字
    • 具体就是把 0x4e00 解码为
#我们具体到游乐场试一下
python3

验证编码

#原始字符串
"一"
#查看原始字符串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字节

图片描述

  • 英文字符和数字占据最大范围兼容ascii
  • unicode把法文等其他字符排出1字节空间
  • 2字节主要是拼音符号文字
    • 拉丁
    • 希腊
    • 西里尔
    • 等等
  • 3字节范围内
    • 首先是印度
    • 然后是杂项
    • 然后是符号
    • 日文假名
    • 然后是中日韩CJK
  • 4字节
    • 各种扩展集

极大扩展

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

图片描述

图片描述

如果遇到乱乱码

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

图片描述

总结

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