show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 数字字符编码从博多码到
ascii
、8859
各自割据 - 如何把世界上各种字符统进行编码
unicode
顺势而生不断进化- 不过字符总量超过了
65536
2
个字节放不下
- 究竟应该用几个字节理解存储的这些字节呢?🤔
1字节
省空间 可是范围窄2字节
居中3字节
费空间 可是范围广
- 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
- 3 字节范围内
- 11110开头的
- 4 字节
- 各种扩展集
- unicode 开始逐渐流行
- 一旦一种编码在世界上开始流行
- 他就会挤压其他的编码方式的生存空间
- 到了 2020 年 95%的网页使用 unicode 编码
- 到了 2021 已经达到了 97.4%
- 感觉这是全球化一体最终的编码方式
- 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
让字符范围得到了极大扩展 - 到底扩展出什么好玩的字符呢?🤔
- 我们下次再说!👋