ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 字符编码 ### 前言 一直以来想写一篇文章通俗的讲一下字符编码这件事,一是因为工作中经常用到,虽然理解,但是使用时总觉得底气不足容易出错,所以希望对自己的理解有个总结,从最开始的源头去理清它,让我以后即使不碰代码很久,但只要一想到这篇文章就能够马上记起,马上理解。二是因为网上的文章大多是讲概念,只讲“是什么”,没有讲“为什么”,没有很好的讲清楚什么是编码,为什么要编码,另外我也希望非程序员也能够理解字符编码这件事,编码并不只是在和计算机打交道时才需要用到,日常生活中也会用到,只是大家平常没觉察到,编码只是信息转换的思想而已,如果大家学会了这种思想,会重新发现生活中还有很多与编码相关的有趣的事情。 所以这是一篇通俗易懂,适合任何人群阅读的文章,不论你是程序员,还是非计算机相关职业的,只要你想了解字符编码就都可以阅读,比如你想知道文档里出现的乱码是什么东西,又为什么乱码,火星文是什么,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