show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次回顾了各国家和地区字符编码的分别的进化过程
- 0-127 个字符
- 还都是兼容 ascii 编码
- 世界各地编码分布
- 拉丁字符扩展 ascii 共 16 种
- 无法同时显示俄文和法文
- 中日韩各有各的编码格式
- 无法同时看中文简体和中文繁体
- 拉丁字符扩展 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个字节 以内
- 字符数量也很多
- 最常用的在0x4E00-0x9FBF
- 我们对比一下原来\x表示法和\u表示法
- 原来
ascii
字符a
可以用\x61
表示\x61
对应十六进制的(61)十六进制- 占用
一
个字节 - 使用
\x
进行转义
- 现在
unicode
字符一
可以用\u4e00
表示\u4e00
对应十六进制的(4e00)十六进制- 占用
两
个字节 - 使用
\u
进行转义
- ascii 字符也能用
\u
的方式进行转义
\u
必须得4位16进制数- 不过这样有点浪费空间和带宽
- 序号、字节状态和字符是什么关系呢?
- 序号、字节状态和字符
- 这三个东西也构成一个闭环
- 就像ascii一样
- 两个汉字的unicode编码
- 占用四个字节
- 已知汉字,得到 unicode 值,叫做编码
- 过程为 encode
- 已知 unicode 值,得到汉字,叫做解码
- 过程为 decode
- 把 str 字符串 encode 编码 为 bytes 字节序列
- 把 bytes 字节序列 decode 解码 为 str 字符串
- 编码和解码是互为逆运算的
- 绕了一圈又回来了
- 😁
- ascii 得到字符串的编码状态
- eval 得到编码的字符串状态
- 这两个也是逆运算
- eval应该如何理解呢?
- help(eval)
- eval
- 意思是evaluate衡量
- 是一个内置的函数
- 在
__builtins__
这个module里面 - 根据全局变量和局部变量的值进行衡量
- 这里衡量的是
- 按unicode形式的编码好的字符串
-
在火星文转化器中
- 团长,我从此就是杀马特的人了,爱你呦
- 團萇,莪苁泚僦湜摋骉特哋亾孒,嬡沵呦。
- 爱我不是你的错
- 嬡莪芣湜沵哋措
- ༺༒妳ィ是俄棏翄艕ོ
- today is my birthday
- 特嘚[表情]孓麥波斯嘚
- 团长,我从此就是杀马特的人了,爱你呦
-
其实火星文就是把常用汉字序号
- 和不常用的汉字的序号
- 对应了起来
- 文字转化就是找到序号的映射
- 但是如果 2 个字节总共 16 位
- 16 位最多 65536 各字符
- 想要把全世界的字符都编码是不现实的
- 如果使用 3 字节编码就大大增加了存储和带宽的压力
- 那到底应该怎么办呢?
- 到底应该按照 1 字节、2 字节还是 3 字节进行读取呢?
- 数字字符编码从博多码到
ascii
、8859
各自割据 - 如何把世界上各种字符统进行编码
unicode
顺势而生不断进化- 不过字符总量超过了
65536
2
个字节放不下
- 究竟应该用几个字节理解存储的这些字节呢?🤔
1字节
省空间 可是范围窄2字节
居中3字节
费空间 可是范围广
- 我们下次再说!👋