Skip to content

Latest commit

 

History

History
326 lines (234 loc) · 9.19 KB

47-92414-unicode.sy.md

File metadata and controls

326 lines (234 loc) · 9.19 KB
show version enable_checker
step
1.0
true

unicode

回忆上次内容

  • 上次回顾了各国家和地区字符编码的分别的进化过程
    • 0-127 个字符
    • 还都是兼容 ascii 编码
  • 世界各地编码分布
    • 拉丁字符扩展 ascii 共 16 种
      • 无法同时显示俄文和法文
    • 中日韩各有各的编码格式
      • 无法同时看中文简体和中文繁体
  • 如果有一种编码所有的字符都能编进去就好了
    • 中日韩欧洲拉丁拼音等等等都包括
  • 能有么?🤔

图片描述

回顾历史

  • 计算机中只有 0、1
    • 并且是存储在字节里的
    • 原来只能表示和处理数字
    • 字符无法处理
  • 后来某些二进制数固定下来代表一个字符
    • 形成了编码
    • 从博多码(5bits)到 BCDIC(6bits)
    • 再到 EBCDIC码(8bits) 最后统一于 ascii
  • 但是各国家和地区都有自己的字符
    • 这一领域没有统一的标准
    • 所以每个国家和地区指定自己的标准
    • 想要同时显示法语字符和希伯来字符是不可能的
    • 同样字节状态在不同编码格式里代表不同的字符
    • 都认为对方是乱码
    • 彼此不兼容
    • 编码方式有上百种之多

图片描述

分久必合

  • 无法解决的问题背后其实可能是机会
    • iso-8859-1 最早把西欧字符容了进来
  • Xerox 在 1980 年代开始尝试一种编码能融合多语言
    • Xerox 字符集包括拉丁、阿拉伯、希伯来、希腊、西里尔和中日韩字符
    • 这个字符集 1988 年进化为 unicode
  • uni 来自于
    • unique
    • unified
    • universal
    • unicorn
    • university
    • uniform

图片描述

得一

  • 这个词头计算机领域也有很多很牛的单词
    • unity、unit、unix
  • 这名字得一了啊
    • 少则得,多则惑,是以圣人抱一为天下式
    • 天得一以清,地得一以宁,神得一以灵,谷得一以盈,万物得一以生,侯王得一而以为正
  • 这个版本叫做 unicode88,是 16 位的 unicode
    • 1989 年 Unicode 这个工作组来了一些从大厂来的人,微软和 sun 都来了
    • 1991/1/3 日,Unicode 委员会在加州成立
    • 1991 年 8 月,unicode 第一卷发布
    • 1992 年 6 月,第 2 卷发布,这里面包含了汉语字符
    • Adobe, Apple, Facebook, Google, IBM, Microsoft, Netflix 和 SAP SE 加入 unicode 委员会
  • 字符的全球标准化开始了

图片描述

基础字符

  • 紧挨着 ascii 的字符位置非常重要
    • 这个字符集就是 Latin-1
    • 他是由 8859-1 西欧字符集进化而来

图片描述

持续进化

  • 每个版本都会有些变化
    • 整个编码区域分成若干个 blocks
    • 新版本对于这些 blocks 里面的字符有所增加

图片描述

  • 除了字符之外还有很多符号
    • 十二个星座

十二星座

图片描述

  • 集装箱标准化一旦开始
  • 就会反过来约束火车轮船飞机
  • 你要想加入这个交流的行列
  • 必须要先从遵守现有的规则开始
  • 新编码unicode的时代来了
  • 他会把一切字符吸收进去

阴阳太极

  • 易有太极
    • ️☯

图片描述

  • 是生两仪
    • ⚊ 陽 (U+268A) ⚋ 陰 (U+268B)
  • 两仪生四象
    • ⚌(太陽,U+268C)、⚍(少陰,U+268D)、⚎(少陽,U+268E)、⚏(太陰,U+268F)

图片描述

八卦

  • 四象生八卦
    • ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷

图片描述

  • 如果把

    • ⚊ 陽 (U+268A)当做1
    • ⚋ 陰 (U+268B)当做0
  • 顺序是逆序(递减)

  • 从外而内

  • 八卦有了

    • 可以重卦么?

重卦

图片描述

  • 八八六十四卦

图片描述

  • 还能做什么呢?

乱来

  • 来随便试一个
print("\u9999")

中日韩字符

  • 中文编码原来是 gbk

  • unicode 现在unicode把中日韩(CJK)当成一组

    • 排序是CJK

图片描述

  • 当然关于排序各有各的排法
    • 中国是中日韩
    • 日本是日中韩
    • 韩国是韩中日
    • unicode组织显然综合参考了东亚儒家文化圈的各种排名方法

图片描述

  • 象形文字数量确实是拼音文字没有办法比的
  • 他们听到我们有两万个字母的时候都傻了
  • 具体如何分布呢?

分布

图片描述

  • 分在几个 blocks 里面
    • 最常用的在0x4E00-0x9FBF
      • F、B都是16进制的数字就像1、2、3一样
      • 这个范围就是中日韩字符的范围
    • 也属于 2个字节 以内
    • 字符数量也很多

图片描述

  • 我们对比一下原来\x表示法和\u表示法

两种转义

  • 原来ascii字符a可以用\x61表示
    • \x61 对应十六进制的(61)十六进制
    • 占用个字节
    • 使用\x进行转义
  • 现在unicode字符可以用\u4e00表示
    • \u4e00 对应十六进制的(4e00)十六进制
    • 占用个字节
    • 使用\u进行转义

图片描述

  • ascii 字符也能用 \u 的方式进行转义

图片描述

  • \u必须得4位16进制数
  • 不过这样有点浪费空间和带宽
  • 序号、字节状态和字符是什么关系呢?

关系

图片描述

  • 序号、字节状态和字符
  • 这三个东西也构成一个闭环
  • 就像ascii一样

图片描述

编码解码

  • 两个汉字的unicode编码
  • 占用四个字节

图片描述

  • 已知汉字,得到 unicode 值,叫做编码
    • 过程为 encode
  • 已知 unicode 值,得到汉字,叫做解码
    • 过程为 decode

encode decode

图片描述

  • 把 str 字符串 encode 编码 为 bytes 字节序列
  • 把 bytes 字节序列 decode 解码 为 str 字符串
  • 编码和解码是互为逆运算的

图片描述

  • 绕了一圈又回来了
  • 😁

ascii eval

图片描述

  • ascii 得到字符串的编码状态
  • eval 得到编码的字符串状态
  • 这两个也是逆运算
  • eval应该如何理解呢?

eval

  • help(eval)

图片描述

  • eval
    • 意思是evaluate衡量
    • 是一个内置的函数
    • __builtins__这个module里面
    • 根据全局变量和局部变量的值进行衡量
    • 这里衡量的是
      • 按unicode形式的编码好的字符串

洳淉嬡,埥堔嬡。

  • 在火星文转化器中

    • 团长,我从此就是杀马特的人了,爱你呦
      • 團萇,莪苁泚僦湜摋骉特哋亾孒,嬡沵呦。
    • 爱我不是你的错
      • 嬡莪芣湜沵哋措
      • ༺༒妳ィ是俄棏翄艕ོ
    • today is my birthday
      • 特嘚[表情]孓麥波斯嘚
  • 其实火星文就是把常用汉字序号

    • 和不常用的汉字的序号
    • 对应了起来
    • 文字转化就是找到序号的映射

中文字符集进化

图片描述

  • 但是如果 2 个字节总共 16 位
    • 16 位最多 65536 各字符
    • 想要把全世界的字符都编码是不现实的
  • 如果使用 3 字节编码就大大增加了存储和带宽的压力
    • 那到底应该怎么办呢?
  • 到底应该按照 1 字节、2 字节还是 3 字节进行读取呢?

总结

图片描述

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

图片描述