字符编码
最后更新于:2022-04-02 04:31:13
## 字符编码
### 前言
一直以来想写一篇文章通俗的讲一下字符编码这件事,一是因为工作中经常用到,虽然理解,但是使用时总觉得底气不足容易出错,所以希望对自己的理解有个总结,从最开始的源头去理清它,让我以后即使不碰代码很久,但只要一想到这篇文章就能够马上记起,马上理解。二是因为网上的文章大多是讲概念,只讲“是什么”,没有讲“为什么”,没有很好的讲清楚什么是编码,为什么要编码,另外我也希望非程序员也能够理解字符编码这件事,编码并不只是在和计算机打交道时才需要用到,日常生活中也会用到,只是大家平常没觉察到,编码只是信息转换的思想而已,如果大家学会了这种思想,会重新发现生活中还有很多与编码相关的有趣的事情。
所以这是一篇通俗易懂,适合任何人群阅读的文章,不论你是程序员,还是非计算机相关职业的,只要你想了解字符编码就都可以阅读,比如你想知道文档里出现的乱码是什么东西,又为什么乱码,火星文是什么,emoji 表情是什么,为什么有的软件中昵称设置不支持带表情,...,等等这类问题其实都和编码有关,好了不多说,让我们开始吧。
----
### 先看字面意思
字符编码由字符和编码两个词组成,字符就是你现在看到的每个文字,也就是一切文字和一切符号,字符是用来表示信息的,为了描述更准确直接,你可以将文字看作是符号,下面我们只说符号而不提字了,这个符号可以是任何象征形态,不只是汉字,比如你和小伙伴创造了一个只有你们才知道意思的符号,其他人看到只是一个奇怪的涂鸦形状,但只有你们知道这个符号的意思,这种符号也是一个符号,所以**符号是信息的载体**,任何形状只要你赋予了它含义,它就是一个携带的符号了。
万物皆有所相,都能通过信息描述出来,所以世界上才会有那么多的符号,我们创造符号都是有目的,都是为了描述信息的。
怎么理解字符是信息的载体呢,你能看到这篇文章,阅读时就如同有人在跟你对话一样,我将我想说的传达到你了,这种传达就是通过我敲下的字符表达出来的。我将想表达的思想用符号写成文章,你读到这些符号,“听”到了我的表达,我们没有面对面,但是我想表达的信息却通过符号传达给你了,所以符号就是信息的载体。
所以,字符就是符号,符号是信息的载体。
再来看编码,讲编码之前我们还是先看个生活中的场景。现在先理解字符就行了,不急着讲编码,否则一开始就涉及到枯燥的理论规则大家可能就没了兴趣,先理解了编码的来龙去脉,到后面大家知其所以然,水到渠成自然就理解了。
----
### 如何分辨煎包是什么馅的
----
### 程序里的编码
写过代码的对编码 `encode` 和解码 `decode` 两个函数都不陌生了,
----
### 摩斯密码
符号是信息载体,那声音可以吗,当然也可以。
----
### 电梯里的盲文
----
### 思考
任何信息都可以被编码,只要有需要都可以设计一套编码规则。
----
### 参考
~~~
00000000 - 11111111 1个字节,256(8 * 8e)
00 - FF 1个字节,256(16 * 2e)
00000000 - FFFFFFFF 4个字节,4294967296(16 * 8e)
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
----------------------+---------------------------------------------
0000 0000 - 0000 007F | 0xxxxxxx
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
----
解码器程序:
1. 读取前两个字节,确定 编码的大小端
2. 确定编码方式,去除 BOM 等符号
3. 调用对应的编码解析器
4. 使用编码器解析字节
5. 考虑字节不完整,不正确的情况
6. 输出解码结果
~~~
[Unicode To UTF8 Online· 开发者工具箱](https://devtool.tech/utf8)
[字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志](http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)
[非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有](https://www.bilibili.com/video/BV1gZ4y1x7p7)
[非常生动的Python2和Python3的编解码讲解](https://www.bilibili.com/video/BV1XK4y1t7D4)
[一个神奇的Unicode字符:RLO(不要拿来干坏事)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili](https://www.bilibili.com/video/BV1Xk4y117He/?spm_id_from=333.788.recommend_more_video.4)
~~~
字节 解码 成 Unicode形式
Unicode形式 编码成 字节
在python中它们两者打印时都可以显示成字符
字节是编码的结果,是已确定了编码类型的(如 utf-8)二值序列,是信息的载体,否则字节就没有任何意义
信息加载进内存和保存到磁盘上时需要编码转换成字节序列,处理或打印时需要解码出信息,编码解码是一种信息转换规则。
之前 把字符 带进了编码解码 中,看来是错误的理解,字符只是显示时的一种形式符号而已,只是查编码表显示出来符号而已,这个过程是操作系统处理的,程序不会干预,在程序内存中并不存在这个符号的概念。
~~~
[【社长说13】当年你用小本本记过蝌蚪文一样的“密码”吗?](https://www.bilibili.com/video/BV1PW411a7p2)
微信设置彩色昵称,火星文字,长草文字,编码
[字符串的扩展 - ECMAScript 6入门](https://es6.ruanyifeng.com/#docs/string)
> 有了这种表示法之后,JavaScript 共有 6 种方法可以表示一个字符。
----
% = %25(鸡=蛋)(%表示鸡,25 表示生一次)
%25 = %2525(蛋 = 鸡生的)
%2525 = %252525 (鸡生的 = 蛋生的鸡再生的蛋)
~~~
鸡 = 蛋生的
蛋 = 鸡生的
鸡 = 蛋生的
蛋 = 鸡生的
...
鸡 = 鸡生的 = 蛋生的
蛋 = 鸡生的 = 蛋生的
鸡 = 蛋
~~~
----
last update: 2020-12-06 22:45:33
';