| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络-字符编码的由来(为什么会有乱码,ASCII、Unicode、GBK和UTF-8字符编码区别) -> 正文阅读 |
|
[网络协议]计算机网络-字符编码的由来(为什么会有乱码,ASCII、Unicode、GBK和UTF-8字符编码区别) |
???????为什么我们在网络中传输数据,需要指定字符编码,例如使用UTF-8、GBK等编码。那么字符编码到底是什么?以前我也很困惑这个问题,但是学习了计算机网络后我们知道,由于底层电路的设计本质,只能是识别0和1两种代码,那么传递的也只能是0和1了。
???????既然计算机只能识别0和1,那怎么才能把0和1转成我们的中文、英语等各种字符语言呢? 首先复习一下基础知识-字节
???????综上所述,一个字节就是有8位,即有8个0或1组成的数字顺序就叫一个字节。字节是计算机中表示数据大小的基本单位。 8位转成十进制,即2的8次方(2222222*2)=256,第一个是0开始,所以就一个字节可以表示0-255的数字范围
再回顾一下网络中的数据包
字符编码的由来就是我们需要建立一张映射表,把数字映射出相应的字符信息。我们把获取到的字节表示的数字,根据这个映射表,把数字转成字符。
ASCII编码ASCII编码就是这样的一个映射表,我们先看看ASCII编码的字符集是怎么样的?
就是这样的字符编码规则,将字符与二进制对应上了,当你收到了这样的二进制,你根据这个编码规则反过来就知道收到了哪些的字符。
这就是字符编码的由来,因为计算机只能表示0和1,所以我们需要发送方和接收方都是用同一套字符编码来解析接收到的0和1表示的意思,否则接收到的0和1就没有意义了。
我再来两个我们常见的举例 一个很有意思的微信加密聊天这里大家发的都是一些表情,别人怎么知道是什么意思呢?这就需要发送的人和接收的人都有同一个解析的表情对应表,即我们上面说的字符编码。其他人看到,但是他没有这个字符集编码,那他就不能解析这里面的内容是什么。(当然也可以靠我们的聪明才智去破译) 电报机的通讯???????例如我们看抗日战争剧,经常看到用电报机通讯,电报机在滴滴答答的响,也经常看到破译了对方的电报内容的场景,还有密码本被盗的场景。电报机是怎么通讯的?其实电报机就是利用电流发送电磁波,对方监听的波长与发报波长一致即可收到。电报收下来一般都是数码例如一份报是1234 2234 3234,接收方收到了这些数字,怎么知道是什么意思呢?这时候接收方会那出密码本,查询一下每个数字对应的字符,然后再把这些字符拼接起来,就能还原出原来通讯的内容了。
???????还有为什么能经常看到说破译了对方的报文?如何破译?就是发送方发送的电磁波,监听的波长与发报波长一致即可收到,即敌我双方都能接收到,但是别人没有密码本,解析不出来报文的内容,但是可以分析多个报文(就像大数据一样),看看哪些多次出现的数字,再合理分析可能表达的意思。最后就有可能分析出一些有用内容。 ???????好像扯远了,上面的举例主要是想形象说明网络中的通讯,为什么需要字符集编码,字符集编码的由来。就是要把接收到的0和1表示的数字转成对应的字符信息。 为什么会乱码???????大家是否看到过类似这样的乱码"“б?ЯАзЪСЯ”、“�???”?" ,为什么前端传输过来的数据,后端接收后会显示乱码?或者为什么后端的数据,保存到数据库后乱码?
常见的乱码场景???????例如开发过程遇到的get请求时候参数中含有“中文”时,传到后端接收中文就会乱码。为什么乱码?遇到乱码的场景不要慌,先分析原因,必定是因为客户端发送的编码和后端服务器接收的编码不一致导致的。 ASCII、Unicode、GBK和UTF-8字符编码的由来???????ASCII编码是美国设计,但是他们可能没想到还有亚洲国家也会有一天用上计算机,ASCII编码没有我们的中文汉字对应的字符。而且ASCII编码一个字符一个字节,最大映射的字符数就是256个。而我们的汉字的数量大约将近十万个,常用汉字也有好几千字。 ???????所以等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢,于是我们建了一个自己的字符集编码,一个字节不够对应我们的汉字,所以我们用了两个字节表示一个汉字字符,发明了GB2312这些汉字编码。这样我们就可以组合出大约7000多个简体汉字了。
???????一个字节数字低于127的则和ASCII一样,两个大于127的则表示中文以及其他字符。所以在GBK2312中,英文是一个字节,中文是两个字节,
???????这样的话,各个国家都有一套自己的字符编码规则,所以一个国际组织决定着手解决这个问题,为了统一全球国家的字符集编码,制定了Unicode编码。但是Unicode编码全部使用双字节或使用最长的字节,即如果传一个中文是两个字节,传英文也是两个字节(但是英文本来一个字节就可以了,第二个高字节全是0),就会造成空间浪费。
???????再后来就出现了UTF-8来实现unicode编码,UTF-8是可变字节的编码。 ???????UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
ASCII、Unicode、GBK和UTF-8字符编码区别
参考: |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 19:52:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |