## 字符编码
### 前言
一直以来想写一篇文章通俗的讲一下字符编码这件事,一是因为工作中经常用到,虽然理解,但是使用时总觉得底气不足容易出错,所以希望对自己的理解有个总结,从最开始的源头去理清它,让我以后即使不碰代码很久,但只要一想到这篇文章就能够马上记起,马上理解。二是因为网上的文章大多是讲概念,只讲“是什么”,没有讲“为什么”,没有很好的讲清楚什么是编码,为什么要编码,另外我也希望非程序员也能够理解字符编码这件事,编码并不只是在和计算机打交道时才需要用到,日常生活中也会用到,只是大家平常没觉察到,编码只是信息转换的思想而已,如果大家学会了这种思想,会重新发现生活中还有很多与编码相关的有趣的事情。
所以这是一篇通俗易懂,适合任何人群阅读的文章,不论你是程序员,还是非计算机相关职业的,只要你想了解字符编码就都可以阅读,比如你想知道文档里出现的乱码是什么东西,又为什么乱码,火星文是什么,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
- 开始
- 公益
- 更好的使用看云
- 推荐书单
- 优秀资源整理
- 技术文章写作规范
- SublimeText - 编码利器
- PSR-0/PSR-4命名标准
- php的多进程实验分析
- 高级PHP
- 进程
- 信号
- 事件
- IO模型
- 同步、异步
- socket
- Swoole
- PHP扩展
- Composer
- easyswoole
- php多线程
- 守护程序
- 文件锁
- s-socket
- aphp
- 队列&并发
- 队列
- 讲个故事
- 如何最大效率的问题
- 访问式的web服务(一)
- 访问式的web服务(二)
- 请求
- 浏览器访问阻塞问题
- Swoole
- 你必须理解的计算机核心概念 - 码农翻身
- CPU阿甘 - 码农翻身
- 异步通知,那我要怎么通知你啊?
- 实时操作系统
- 深入实时 Linux
- Redis 实现队列
- redis与队列
- 定时-时钟-阻塞
- 计算机的生命
- 多进程/多线程
- 进程通信
- 拜占庭将军问题深入探讨
- JAVA CAS原理深度分析
- 队列的思考
- 走进并发的世界
- 锁
- 事务笔记
- 并发问题带来的后果
- 为什么说乐观锁是安全的
- 内存锁与内存事务 - 刘小兵2014
- 加锁还是不加锁,这是一个问题 - 码农翻身
- 编程世界的那把锁 - 码农翻身
- 如何保证万无一失
- 传统事务与柔性事务
- 大白话搞懂什么是同步/异步/阻塞/非阻塞
- redis实现锁
- 浅谈mysql事务
- PHP异常
- php错误
- 文件加载
- 路由与伪静态
- URL模式之分析
- 字符串处理
- 正则表达式
- 数组合并与+
- 文件上传
- 常用验证与过滤
- 记录
- 趣图
- foreach需要注意的问题
- Discuz!笔记
- 程序设计思维
- 抽象与具体
- 配置
- 关于如何学习的思考
- 编程思维
- 谈编程
- 如何安全的修改对象
- 临时
- 临时笔记
- 透过问题看本质
- 程序后门
- 边界检查
- session
- 安全
- 王垠
- 第三方数据接口
- 验证码问题
- 还是少不了虚拟机
- 程序员如何谈恋爱
- 程序员为什么要一直改BUG,为什么不能一次性把代码写好?
- 碎碎念
- 算法
- 实用代码
- 相对私密与绝对私密
- 学习目标
- 随记
- 编程小知识
- foo
- 落盘
- URL编码的思考
- 字符编码
- Elasticsearch
- TCP-IP协议
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依赖注入
- 开发笔记
- 经纬度格式转换
- php时区问题
- 解决本地开发时调用远程AIP跨域问题
- 后期静态绑定
- 谈tp的跳转提示页面
- 无限分类问题
- 生成微缩图
- MVC名词
- MVC架构
- 也许模块不是唯一的答案
- 哈希算法
- 开发后台
- 软件设计架构
- mysql表字段设计
- 上传表如何设计
- 二开心得
- awesomes-tables
- 安全的代码部署
- 微信开发笔记
- 账户授权相关
- 小程序获取是否关注其公众号
- 支付相关
- 提交订单
- 微信支付笔记
- 支付接口笔记
- 支付中心开发
- 下单与支付
- 支付流程设计
- 订单与支付设计
- 敏感操作验证
- 排序设计
- 代码的运行环境
- 搜索关键字的显示处理
- 接口异步更新ip信息
- 图片处理
- 项目搭建
- 阅读文档的新方式
- mysql_insert_id并发问题思考
- 行锁注意事项
- 细节注意
- 如何处理用户的输入
- 不可见的字符
- 抽奖
- 时间处理
- 应用开发实战
- python 学习记录
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文档相似度验证
- thinkphp5.0数据库与模型的研究
- workerman进程管理
- workerman网络分析
- java学习记录
- docker
- 笔记
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京东
- pc_detailpage_wareBusiness
- doc
- 电商网站设计
- iwebshop
- 商品规格分析
- 商品属性分析
- tpshop
- 商品规格分析
- 商品属性分析
- 电商表设计
- 设计记录
- 优惠券
- 生成唯一订单号
- 购物车技术
- 分类与类型
- 微信登录与绑定
- 京东到家库存系统架构设计
- crmeb
- 命名规范
- Nginx https配置
- 关于人工智能
- 从人的思考方式到二叉树
- 架构
- 今日有感
- 文章保存
- 安全背后: 浏览器是如何校验证书的
- 避不开的分布式事务
- devops自动化运维、部署、测试的最后一公里 —— ApiFox 云时代的接口管理工具
- 找到自己今生要做的事
- 自动化生活
- 开源与浆果
- Apifox: API 接口自动化测试指南