什么是编码和解码

简介: 什么是编码和解码

编码和解码概念


编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。解码,是编码的逆过程。—— 百度百科

 我对编码和解码的理解:编码是根据一种编码规则,将我所要表达的信息用代码去表示出来;解码是根据解码规则(如果是对称加密的话,编码规则和解码规则是同一个规则),将代码解读出来。


举例说明


我们小时候经常会看一些谍战片,谍战片里总会出现一两个间谍,在敌方打探消息,然后用他和己方能看懂的方式去传递消息,如:摩斯密码。间谍敲出一串摩斯密码——三短三长三短,己方也会通过摩斯密码的规则来去解读对应的意思——SOS,己方就知道了这是求救信息,需要马上去营救被困在敌方的间谍。

 在这个例子中,如果间谍明白此规则,发出三短三长三短,向外求救,但不知道此规则的敌方,只能听到这个声音,而不知道其中的含义,就“单纯”的以为间谍无聊发出此声音。

 下图制定好的规则就指的是编码规则和解码规则,发出消息和解读消息的前提是双方都知道此规则,才会进行有效的消息传递。



对应到java程序中

为什么要编码?


最直接的回答就是防止我们的中文和一些特殊字符出现乱码的现象;详细点讲就是计算机只能识别0和1两个数字,所有的符号和文字都必须经过转换编码才能“翻译”成我们计算机认识的“语言”,相反也是,我们要想显示出我们能读懂的“语言”也必须要进行相应的解码才能从计算机中显示出我们能看懂的文字。


总的来说编码的原因有:

1.计算机中存储信息的最小单元是一个字节即 8 个 bit,所以能表示的字符范围是 0~255 个(2的8次方)

2.人类要表示的符号太多,每个符号无法用一个字节来完全表示

3.要解决这个矛盾必须需要一个新的数据结构 char,从 char 到 byte 必须编码


如何编码和解码呢?

那就是通过一种特定的编码格式转换,其实现在有很多中的编码格式,只要让计算机按照规定的编码格式进行转化,就可以显示成我们自己的字符。那现在就介绍一下目前最常见的一些编码格式:

首先我们要知道编码和编码格式是有区别的?

 编码就是一个编号(数字)到字符的一种映射关系,是一种一对一的映射关系。

ASCII码

 在计算机种中,1 字节对应 8 位二进制数,而每位二进制数有 0、1 两种状态,因此 1 字节可以组合出 256 种状态。如果这 256 中状态每一个都对应一个符号,就能通过 1 字节的数据表示 256 个字符。美国人于是就制定了一套编码(其实就是个字典),描述英语中的字符和这 8 位二进制数的对应关系,这被称为 ASCII 码。

 ASCII 码一共定义了 128 个字符,例如大写的字母 A 是 65(这是十进制数,对应二进制是0100 0001)。这 128 个字符只使用了 8 位二进制数中的后面 7 位,最前面的一位统一规定为 0。

Unicode

 Unicode 只是一个字符集,规定了符合对应的二进制代码,至于这个二进制代码如何存储则没有任何规定。它的想法很简单,就是为每个字符规定一个用来表示该字符的数字,仅此而已。

Unicode编码方案

 之前提到,Unicode 没有规定字符对应的二进制码如何存储。以汉字“汉”为例,它的 Unicode 码点是 0x6c49,对应的二进制数是 110110001001001,二进制数有 15 位,这也就说明了它至少需要 2 个字节来表示。可以想象,在 Unicode 字典中往后的字符可能就需要 3 个字节或者 4 个字节,甚至更多字节来表示了。


 这就导致了一些问题,计算机怎么知道你这个 2 个字节表示的是一个字符,而不是分别表示两个字符呢?这里我们可能会想到,那就取个最大的,假如 Unicode 中最大的字符用 4 字节就可以表示了,那么我们就将所有的字符都用 4 个字节来表示,不够的就往前面补 0。这样确实可以解决编码问题,但是却造成了空间的极大浪费,如果是一个英文文档,那文件大小就大出了 3 倍,这显然是无法接受的。

 于是,为了较好的解决 Unicode 的编码问题, UTF-8 和 UTF-16 两种当前比较流行的编码方式诞生了。当然还有一个 UTF-32 的编码方式,也就是上述那种定长编码,字符统一使用 4 个字节,虽然看似方便,但是却不如另外两种编码方式使用广泛。


 对于编码格式目前最常见的是UTF-8、GBK,它们都是用来序列化或存储 Unicode 编码的数据的,但是分别是2中不同的格式,他们都是 Unicode 的实现方式,当然也还有很多,这里就先介绍这两种啦。


GBK

 全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。

UTF-8

 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。

编码规则:

1.如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。

2.如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。

3.如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节


目录
相关文章
|
10月前
|
Go
go语言中遍历映射(map)
go语言中遍历映射(map)
214 8
|
算法 计算机视觉
【MATLAB 】 EEMD 信号分解+希尔伯特黄变换+边际谱算法
【MATLAB 】 EEMD 信号分解+希尔伯特黄变换+边际谱算法
1269 0
|
编解码
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
《FFmpeg开发实战》书中3.4.3节讲解如何将H.264流封装成MP4。H.264流通常以SPS→PPS→IDR帧开始,这一说法通过雷霄骅的H264分析器得到验证。分析器能解析H.264文件但不支持MP4。ZLMediaKit服务器在遇到I帧时会自动插入SPS和PPS配置帧,确保流符合标准格式。若缺少这些帧,客户端拉流时会报错。FFmpeg开发实战:从零基础到短视频上线》书中提供了更多FFmpeg开发细节。
361 0
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
|
8月前
|
存储 资源调度 Java
计算机基础(1)——计算机体系结构和组成
计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。 在过去的几十年里,计算机科学经历了令人瞩目的飞速发展。经历了电子管、晶体管、集成电路的世代发展,体积越来越小、性能越来越强,为人类带来了巨大的便利和变革,下面我们来回顾计算机的发展历程。
2328 2
计算机基础(1)——计算机体系结构和组成
|
7月前
|
数据采集 人工智能 安全
接入DeepSeek的云盒子AI知识库,欢迎内测!
云盒子AI智能知识库以其开放性和灵活性著称,目前正内测接入DeepSeek-R1。此次升级延续了云盒子的开放理念,为企业提供灵活选择,支持按需定制和自由适配。DeepSeek的加入拓展了知识库的能力边界,满足不同行业需求,提升了文档利用与知识获取的智能化水平。云盒子通过专利数据采集技术、深度解析、权限隔离和持续学习能力,确保高效、安全的知识管理。适用于单文档问答、企业内部知识管理、客户服务支持、教育与培训及医疗单位等多种场景,为用户带来全新体验。
338 1
|
11月前
|
自然语言处理 搜索推荐 机器人
大语言模型及其应用场景
大语言模型(如通义千问)凭借强大的自然语言处理能力,在内容创作、对话系统、翻译、信息抽取、代码生成、智能搜索、教育、企业管理和法律等领域展现巨大潜力,助力提升各行业智能化水平。
1453 0
|
12月前
|
编解码 人工智能 文件存储
卷积神经网络架构:EfficientNet结构的特点
EfficientNet是一种高效的卷积神经网络架构,它通过系统化的方法来提升模型的性能和效率。
362 1
|
搜索推荐 Python Windows
python中对于wordcloud词云生成报错提示的解决
通过搜索印象错误信息:ValueError:Only supported for TrueType fonts,几乎大部分人给出的选项都是让你指定TrueType fonts路径,或者新下载TTF字体,并重新指定,但是这两种解决方案并无法解决报错。 在真正解决问题之前,先来介绍几个与之相关的知识点,对于有经验的人,这样的知识点完全是“小菜”,但是对于初学者,这种知识点就是因为缺少相关实践而无从下手,无从搜索引擎。
|
SQL 监控 安全
|
11月前
|
机器学习/深度学习 算法
【机器学习】揭秘GBDT:梯度提升决策树
【机器学习】揭秘GBDT:梯度提升决策树