有情怀,有干货,微信搜索【三太子敖丙】关注这个不一样的程序员。

本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

前言

乱码这个东西相信大家都遇到过,今天我的女朋友三歪就火急火燎的上来找我:“亲爱的,我的idea怎么输出乱码了?”

我一顿操作就给他搞好了,但是三歪不愧是蘑菇街我的女朋友,好奇心跟我是一样样的,随我。


那为什么会出现乱码呢?

什么是编码,什么是解码?

什么是字符码,什么是字符集?

为什么要有 Unicode ?UTF-8 和 GBK 又有什么不同呢?

三歪坐在我的腿上对我撒娇似的说出这一连串的问题,我这个人宠粉但是更宠女朋友,所以就有了这篇文章。


为什么会出现乱码

我们知道计算机里存储的只会是 0 和 1 组成的字节流,而仅是数字满足不了我们的需求,我们还需要文本的处理等等,但是计算机只认识数字,所以我们需要告诉计算机什么数字代表什么字符

比如我指定 0000 代表 A,0001 代表 B 这样计算机就知道了,所以我要把 AB 这两个字符存入计算机的话,实际存储的就是0000 0001其实就等于把每个字符定制一个唯一的编码

但是这是我的指定,不同的人想法是不同的,比如小明就喜欢 1000 表示 A ,1111 表示 B,那小明的计算机按照他指定的编码方式存储,就是 1000 1111,之后传输给我的计算机,我拿到1000 1111,按照我的编码解出来可能就是 %& 了,这就乱码了。

所以乱码的本质就是编码和解码实现没对应上

有些同学可能对编码和解码的概念不太熟悉,我来解释一下:

  • 编码:其实就是将字符按照一定的格式转换成字节流的过程。
  • 解码:就是将字节流解析成字符。

可以看到随意编码的就会产生各自的计算机都无法正确解析的情况,所以需要有一个标准,大家都按那个标准来指定字符和数字的对应关系。

标准字符编码

美国国家标准协会 ANSI 就制定了一个标准,即美国信息交换标准代码(ASCII),规定了常用字符集的集合和对应的数字编号,例如 65 表示 A。


ASCII 实际上是 7 位编码,用二进制代码表示就是 0000000~1111111,不过 1 个字节是 8 位,所以一般都用 8 位来存储。可以看到 ASCII 代表了 128 个字符,这其实是倾美国的编码,你看同样讲英文的英国,ASCII 上都没英镑的标记。

还有人家的韩文,日文等等,更别说咱们中文了。

1 个字节最多只能表示 256 个字符,所以对我们来说不够用,因此需要扩展,像 GB2312 就是我们国家标准总局发布的《信息交换用汉字编码字符集》,后来又发布了 GBK ,这个 K 就是扩展的意思,在 GB2312 的基础上又添加了很多比如繁体字等字符。

所以说等于每个国家都有自己的标准,因为语言都是不同的,各字符集的不同就导致计算机之间文档的交流非常困难,因此大家又开始了一波标准化。

像美国的 ANSI 组织制定了 ANSI 标准字符编码,其实就是制定平台默认的编码,比如中国的操作系统就用 GBK ,如果是美国就用 ASCII,操作系统会预装这些标准字符集。

不过这只能解决一份文档一份字符编码的情况,假设我文档里面有日语、法语、德语、俄语、中文,你说怎么办?


Unicode

所以又搞了个 Unicode,又称统一码、万国码、单一码

Unicode 字符集涵盖了目前人类使用的所有字符,并为每个字符进行统一编号,分配唯一的字符码,你看这种事情总得有人做,不然就没法统一。

这里有几个术语我解释一下,让大伙更加清晰一些。

  • 字符:其实就像英文字母,或者我们的中文都叫字符
  • 字符集:那就是字符和编号对应的集合
  • 字符码:就是字符集里面字符对应的数字,或者说编号,比如在 ASCII 字符集里面, A 的字符码是 65
  • 字符编码:就是按照字符集中字符和数字的映射关系,转化成字节流的实现

对于 Unicode 而言有一点和之前的编码不太一样,它将字符集和编码实现解耦了。

之前的编码比如 ASCII 编码、GBK 编码等等,它们的字符集和编码实现是绑死的,你可以理解成以前的编码其实就是查表,有一个固定的表格里面存储这字符和对应固定的二进制,比如 A 对应的编号是 65,其二进制序列就是 01000001。

而 Unicode 不一样,它将字符集和字符编码实现分开了,比如 A 对应的编号是 65,但是对应的二进制序列就不一定了,得看具体的字符编码,如果是 UTF-8 编码,则是 01000001,如果是 UTF-16 编码(大端),则是 00000000 01000001


这其实也是为什么我们现在常用 UTF-8 而不是 UTF-16 的原因,可以看到 UTF-16 编码存储效率较低,最少使用两个字节,并且像 C 语言的很多函数都会将 0x00 字节作为字符串的停止符来解析,所以才搞了个 UTF-8,其使用 1~4 字节为每个字符编码,是变长的,具体如何编码的我就不说了,随便查一下就有。

最后

至此我们已经清晰了乱码的根源,也知晓了为什么会有那么多字符编码的出现,毕竟语言多,一开始出了个 ASCII,但是对于其他国家来说不够用,于是都各自进行了扩展。

而编码多了各个国家之间难以做到统一,不易兼容,所以后来国际组织制定搞了个 Unicode 字符集,对所有字符做了统一的编排,并且为了使得编码更加灵活把字符集和编码实现分开来。

对了,为什么英文都不会出现乱码就是因为绝大部分的字符集都是基于 ASCII 扩展的,所以都兼容 ASCII 。

本期就是应该算是一期比较有意思的科普系列,但是还是渴求你的点赞哈哈。

絮叨

敖丙把自己的面试文章整理成了一本电子书,共 1630页!

干货满满,字字精髓。目录如下,还有我复习时总结的面试题以及简历模板,现在免费送给大家。


链接:https://pan.baidu.com/s/1ZQEKJBgtYle3v-1LimcSwg 密码:wjk6

我是敖丙,你知道的越多,你不知道的越多,感谢各位人才的:点赞收藏评论,我们下期见!


文章持续更新,可以微信搜一搜「 三太子敖丙 」第一时间阅读,回复【资料】有我准备的一线大厂面试资料和简历模板,本文 GitHub https://github.com/JavaFamily 已经收录,有大厂面试完整考点,欢迎Star。

为什么会存在乱码?什么是编解码?为什么会有这么多字符集?相关推荐

  1. 【学习日记2023.4.9】之释放资源的方式_编解码_字符流(Reader/Writer)及其子类_转换流( [In/Out]putStreamReader)

    文章目录 1. 释放资源的方式 1.1 try-catch-finally 1.1.1 finally 格式 特点 执行时机 1.1.2 处理IO流中的异常 1.2 try-with-resource ...

  2. 浏览器传输乱码编解码处理

    对浏览器传输数据,进行编解码处理 弱:encodeURI(url),decodeURI(url) 强:encodeURIComponent(url),decodeURIComponent(url) v ...

  3. 解码base64_linux C++ Base64编解码

    Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或 ...

  4. iOS-字符编解码基础

    2019.04.29----Morris_ 问题: 1.ASCII码是什么? 2.为什么需要字符编码? 3.UTF-8编码是什么?UTF-8编码的意义是什么? 4.URL编码是什么?URL编码的作用是 ...

  5. Base64编解码原理并用Java手工实现Base64编解码

    Base64编解码原理 目前Base64已经成为网络上常见的传输8比特字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后进行签名或加密,之后再次Bas ...

  6. 3.2 Java编解码场景及实现

    篇幅还是较长,不知道怎么来分割,索性就一起了 在阅读的过程中,一定要不忘初心(想想为什么学编解码) 正片开始 Java的编解码具体实现 ​ 这里将以实际例子介绍 Java 中如何实现编码及解码,下面我 ...

  7. 一次HTTP请求的编解码。

    URL的编解码 注意:这里所说的URL和URI是针对Servlet进行描述的,也就是request.getRequestURL()和request.getRequestURL()返回的URL和URI结 ...

  8. Java Web中涉及的编解码

    一次http请求涉及的编解码 URL的编解码 URL的组成部分 以Tomcat服务器为例子,其中Port,ContextPath在Server.xml中配置 <Connector connect ...

  9. python decode ignore_python编解码,decode参数设置:ignore

    最近做一个小工具,把wireshark的报文进行解析,拿到请求.因为原始数据为16进制内容,例如"06e50284012e687474703a2f2f74656d707572692e6f7. ...

  10. 【常见的编解码场景】

    常见的编解码场景 一,编码与解码 1.1 字符编解码 字符集和编码 编解码过程分析 编解码举例 1.2 http url编码 1.3 http body编码 1.4 压缩编码 1.5 对象编码 net ...

最新文章

  1. Linux那些事儿之我是Sysfs(2)linux设备底层模型
  2. html css右下角三角形,html – 框内的CSS中的三角形
  3. CodeForces - 1307B Cow and Friend(数学+思维)
  4. python连接mysql代码_Python3连接MySQL(pymysql)转账代码
  5. Linux namespace概述
  6. JPBC库只使用椭圆曲线群,不使用双线性性质。找单位元,逆元等
  7. 2021.08.28-MMsegmentation0.16.0+Cuda10.1+Ubuntu16.04+Pytorch1.8环境安装
  8. css中的伪类与伪元素的区别
  9. Instantiation of Chaincode using Fabric Node manifest for hyperledger/fabric-ccenv:latest not found
  10. linux给文件备份,Linux文件备份
  11. 有MIMIC数据却不知道从何开始?从DIAGNOSES_ICD表开始(五)
  12. mybatis-plus使用和原理剖析之逻辑删除
  13. excel合并两列内容_办公教程:Excel如何快速将两列内容合并成一列
  14. html单标签的语法并举例,HTML简介及举例
  15. 如何使用Nero软件来光盘刻录系统详细教程(图)
  16. Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ext JS之部署到Linux
  17. OpenCV VideoCapture使用方法(视频文件、摄像头、网络视频文件)
  18. 【自存代码】划分数据集为训练集和测试集
  19. 1006592-61-5,5-TAMRA Azide,5-TAMRA N3,5-羧基四甲基罗丹明-叠氮溶于有机溶剂(DMSO、DMF、二氯甲烷),水溶性低
  20. STM32DAC输出遇到的问题

热门文章

  1. C# 实现局域网的windows环境下的桌面分享
  2. 通过本地上传工具把CSV文件导入到百会报表
  3. 未检测到与wia兼容的设备_关于检测到不兼容硬件设备的解决办法
  4. OpenCore引导配置说明第五版
  5. 尚硅谷 硅谷新闻_如果每个人都遥不可及,硅谷会损失什么
  6. smarty模版手册
  7. 华师大版数学分析下知识点总结
  8. java 限制文件大小_java上传文件大小限制
  9. Android联网的权限
  10. HttpClient下载图片不完整的解决办法