编码,是信息从一种形式或格式转换为另一种形式的的过程;
解码则是编码的逆过程。
What is Code?
代码,从数学上通俗的讲就是一个符号集到另一个符号集的映射。例如数字系统,摩斯电码,盲文等。不同于小说诗歌文学等在特定场景下存在多种解释,代码更加的客观(一一对应)。通常代码是为了促进沟通(不局限于人与人之间,实际上代码很大的一个侧重点在人与物的沟通,例如人与计算机,人与动物)。
数字系统
0b,0o,0x,分别对应python中二进制(bin),八进制(oct),十六进制(hex)
* Binary
二进制的出现,是物理世界的限制,非黑即白的世界更好理解,男孩和女孩、白天和黑夜,动物和植物,水和我,炎热与寒冷;同时也是客观理性的存在,冷冰冰的机器不会出错,没有感情。0 or 1;To be,or To be NOT, That’s a question; True or False
Fact of Life #1: Computers are built on bytes,0,1,1,0...
- Decimal
不管是阿拉伯数字还是罗马数字,首先联想的都是十进制,十进制主要应用于人类之间的交流。这可能跟我们有10根手指有关,如今我们已经在使用十进制是那么自然,甚至都不会去想我们为什么使用的是十进制。 - Octal
Octal来源月拉丁语的八。八进制是另外一种数数的方式。当然七进制也是可以用来数数的,不过自然界更多的是有两只手。想象一下如果一个人的一只手只有4根手指,我们可能用的就是八进制而不是十进制了。计算机用二进制,我们用十进制。二进制书写起来冗长,与人类交互不方便,八进制和十六进制的额出现简化二进制的表示(都是2的指数幂3),增加了可读性或者标记方便。
Dec25=Oct31(圣诞节🎄就是万圣节🎃)
八进制把二进制以3个3个分组,十六进制把二进制以4个4个分组,但是都表示的同一个数,更多的只是过去人们的习惯。(四进制可能也存在吧,不过被淘汰了)
现在最有名的八进制应用因该是unix的文件权限chmod命令了。
chmod 777 main.py
- Hexadecimal
0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,十六进制相比八进制,阅读更加简洁。一个字节(1byte=8bit,至于为啥是8bit,这也是基于历史原因)能且只能由一对十六进制来表示(00——FF),比如10110110可以表示为B6,如果使用四进制的话仍需4个数来表示,不够简洁;使用八进制的话,最靠左的八进制数是由两位二进制数字来表示的(2+3+3),稍显美中不足。现在你在计算机里面的见到的很多都是十六进制(回忆一下计算机蓝屏时候的错误提示:Win7系统出现0x0000003b停止错误)。
:%! xxd
可用于查看文件十六进制的编码,%! xxd -r
用于还原
摩斯密码
战争时期的秘密通讯,最近热门电影《寄生虫》的地下室通过灯泡与外界传递信息,都是摩斯密码,相比数字系统,摩斯密码要更加高级了,映射的不仅仅是数字,已经是文字了(当然通过数字来映射文字是后话)。
盲文
我理解的的盲文就是手工读取二进制数据表示的文字(是否凸起),当然会了方便会有一些简化和集成,下次坐电梯的时候注意楼层按键可能会有盲文。
文本
其实文本这个概念更加的广泛,盲文也有书籍,这里特指计算机上的文本文件。
大多文件的文件名后缀并没有实际的意义,只是让电脑方便链接文件和应用程序。
* 机器码(0,1...)
* 纯文本文件(.py,.java等)
* CSV,TSV:分隔符文件
* markdown
* 富文本:word,excel...
tips
:set fileformat
查看文件系统*格式(line break区分)
$ file helloworld
产看文件类型
* NOEOL
The new line at the end of the file. 每个文件的结尾新开一行是一个好习惯
当你在linux的vim中打开一个结尾没有新开一行的文件时,vim会提示noeol,同时会自动帮你新增一行显示
* line break
LF(Line Feed, Unix and MacOS):0a
CR(Carriage Return, Classic macOS): 00
CRLF(Windows): 000a
Encodings
Encodings is just a mapping from bytes to characters.
Fact of Life #2: The world needs more than 256 symbols
:set encoding
查看vim内部使用的编码格式
:set fileencoding
查看文件的编码格式
Map single bytes to characters
- ASCII: American Standard Code for Information Interchange
只定义在0-127号位置,不同的国家在128–255段定义各自的字符 - ISO 8859_1
ISO 8859_1是单字节编码,向下兼容ASCII,主要应用于欧洲,vim常见的Latin1编码其实就是ISO 8859_1的别名 - ISO 8859_N
后续延伸了很多版本的编码 - Windows-1252
又称CP 1252,主要用于英文或某些其他西方文字版本Microsoft Windows的预设编码,为Windows代码页之一。此编码是ISO 8859_1的超集
Map second bytes to characters
- gb2312
汉字两字节编码,1980年发布,在1995年发布了GBK - GBK
GBK全称《汉字内码扩展规范》(GBK即“国”,“标“,”扩展“汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification),1995年12月1日制定。
vim “+e ++enc=gbk” test
或者在vim中使用:e ++enc=gbk test
以指定GBK编码格式打开文件
* cp 936
cp 936其实就是GBK,IBM在发明Code Page的时候将GBK放在第936页,所以叫936
* Shift-JIS
* Big5
Unicode&World: code point
Tower of Babel: 上帝留在历史上的第一座“烂尾工程”,通天塔,嘈杂和混乱的场面,嘈杂的声音。
每个国家都有自己的编码要求,制定自己的编码规范,这无疑阻碍了世界一体化。能不能一次性搞定?
Unicode是一个符号集(对应python3中的str类型),他把世界通用的字符映射到一个code pint(integer),你可以把unicode理解为包含全世界所有文字的语言,甚至各种丰富的表情,一个大的并集。但是你必须要选择一种编码方式将code point映射到字节。
Python3中不会隐示的将bytes转换为str,也就是bytes类型到str的转换。与这里的unicode和utf-8一起理解
Fact of Life #3: Need to keep them straight, Need to deal with both
- UTF-8
全称8-bit Unicode Transformation Format, 又称万国码,由Ken Thompson于1992年创建。其用1到6个字节编码unicode字符。用在网页上可以统一页面显示中文简体繁体及其他语言。注意:UTF-8只是unicode的实现方式之一
编码之王:不同的code point选择合适变动的字节长度,ASCII仍然只占用一个字节。UTF-8.的字符边界容易检测,所以容错性高,局部的字节错误不会导致连锁性的错误。但是UTF-8也不完美,文化上不平衡,对于欧美以英语为母语的国家友好(没有任何额外的存储负担);但是对于中日韩等国家就冗余了,一个字符需要占用3个字节;同时变长字节相比固定长度会带来效率问题(例如计算字符数),执行索引操作效率不高。所以实际上为了解决这个额问题,常常会考虑把UTF-8.看转换为UTF-16或者UTF-32后再操作,操作完后再转换回去。
- UTF-16
同样,UTF-16也只是unicode的实现方式的一种。世上没有免费的午餐,we need trade-off。UTF-16相比UTF-8,好处在于大部分字符都以固定长度的字节(2字节)存储,但是UTF-16能表示的字符只有6万多个(相比现在Unicode已经收录的还是不够),而且其无法兼容ASCII编码,同时UTF-16还有BOM(Byte Order Mark)的区分,一般来说以Macintosh制作或存储的文字使用BE,以Microsoft或linux制作或存储的文字使用LE。 - UTF-32
UTF-16的更广的延伸,4字节固定的编码规范
Detect the encoding
Fact of Life #4: You cannot infer the encoding of bytes
You must be told, or you have to guess
* #_*_ coding:utf-8 _*_
Fact of Life #5: Sometimes you are told wrong
Tips
- Unicode sanwich
Bytes on the outside, Unicode on the inside. Encode: str—>bytes,;Decode:bytes—>str - Know what you have
Bytes or Unicode?
If bytes, what encoding? - Test Unicode
Reference
- 《编码:隐匿在计算机软硬件背后的语言》
- Unicode之痛
- 字符编码笔记:ASCII,Unicode和UTF-8
- 《Fluent python》Chapter 4
Comments | NOTHING