计算机编码发展历史和编码方式

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

为什么出现多种编码?

相信计算机专业的都知道,所有的数据(文本,音频,视频等等)在计算机内部都是以二进制形式来表示的。而计算机内部为什么采用二进制则是由硬件决定的(计算机采用了具有两种稳定状态的二值电路)。这样,就引出一个问题:
我们人类不适合直接看二进制。
因此,需要用一种方法,将二进制转为我们能看懂的东西。编码就应运而生了。

编码发展历史

第一阶段:
在计算机中,所有的数据只可能是0或者1(用高电平和低电平分别表示1和0),那么我们通常看到的字符也就只能用0和1来表示。于是科学家们(这里指的是美国的科学家)就想出一个办法,把一个特定的数字对应一个特定的字母进行存储和传输,比如我需要存储字母a,那么我存入一个数字97(即在计算机中存入二进制(01100001),这个过程叫做编码(encode),而我们在读取数据的时候,当遇到97时,我们就让计算机显示字母a,这个过程叫做解码(decode)。
这里你应该知道:

  • 计算机看懂的东西我们看不懂,我们看懂的东西,计算机看不懂。

把计算机看懂的东西(二进制(01100001))变成我们看懂的东西(数字97,也就是a),这个过程叫解码(decode)
把我们看懂的东西(数字97,也就是a)变成计算机看懂的东西(二进制(01100001)),这个过程叫做编码(encode)
为了大家在数据传输的时候不至于产生误会,那么我们需要让所有的人都使用数字97来代表字母a,所以需要制定一份标准(即码表),最开始的这个标准叫做ASCII码表。
ASCII码的实现方式:
最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255)。
由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里(即用一个字节的后七位),也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。

第二阶段:
随着发展,计算机开始普及,当计算机流传到欧洲时,问题再次出现,原本的ASCII编码只能解决美国人的编码问题,无法将欧洲的文字表示出来。于是乎,欧洲人就把ASCII码中没用到的第一位给用了,即:

  1. ASCII码用一个字节的后七位,表示范围是0-127;
  2. 欧洲人把这个字节的第一位也用了,表示范围0-255。除去原本的0-127,剩下128-255:128-159之间为控制字符,160-255位文字符号,其中包括了西欧语言、希腊语、泰语、阿拉伯语、希伯来语。砖家们决定把他们的编码名称叫做Latin1,后面由于欧洲统一制定ISO标准,所以又有了一个ISO的名称,即ISO-8859-1。

第三阶段:
计算机技术当然也传到了亚洲大地,比如中国。原本的一个字节的8个位全都用完了,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
问题又来了:

  • 你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
到了这里:已经知道的编码方式主要有两种:ASCIIUnicode
现在,捋(lǚ)一捋ASCII编码和Unicode编码的区别:

  1. ASCII编码是1个字节,而Unicode编码通常是2个字节。(如果要用到非常偏僻的字符,就需要4个字节)
  2. 字母A用ASCII编码是十进制的65,二进制的01000001;
  3. 字符'0'用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的;
  4. 汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。

你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。
新的问题又出现了:

  • 如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

字符ASCIIUnicodeUTF-8
A0100000100000000 0100000101000001
x01001110 0010110111100100 10111000 10101101

从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

ASCII,Unicode,utf-8之间的关系

看完上面的东西,可能有点乱,我这里简单总结一下ASCII,Unicode,utf-8之间的关系:

  • ASCII是计算机刚刚起步的时候用得编码方式,特点是可以表示的字符特别少,但简单易用。
  • Unicode是随着计算机发展,ASCII已经无法表示世界各国这么多文字而出现的一个新的编码方式,优点是编码快速,缺点是占用内存大。(如果你的文本全都是英语,如果用Unicode时,每个字符占用两个字节。而用ASCII每个字符只占用一个字节);
  • 为了解决Unicode的内存占用大问题,出现了utf-8,utf-8可以根据字符的类型,自动选择最优编码。但缺点是编码速度慢。

所以有了令人容易搞混的问题出现:

  • 什么时候用utf-8(这里utf-8已经包括ASCII,ASCII编码实际上可以被看成是UTF-8编码的一部分)编码方式?什么时候用Unicode编码方式?

什么时候用utf-8编码?
答案很显然:对内存消耗要求高的,对速度要求不高的场景下用utf-8。(注意:这里的速度是指cpu运算速度)
那你就想啊,什么时候对内存消耗要求高?很容易地就想到当我们要保存在硬盘的时候肯定是想占用空间越少越好啊,当我们在网络上传输肯定也想占用空间越少越好啊,所以,当我们的数据保存在硬盘的时候,当我们数据要在网络传输的时候,用得就是utf-8编码。

什么时候用Unicode?
答案显然:对速度要求特别高的,相对之下占用空间大小可以稍微妥协的场景下用Unicode编码。
我们知道,数据想被处理,首先得加载都内存上,这样,cpu才能以非常惊人的速度再内存上获取要处理的数据。这样,我们就轻易知道,当数据被加载到内存上时,在内存中的编码方式是Unicode。
我们来个总结:
1.我们平时电脑磁盘中的一个文件(abc.txt)其实是以utf-8编码方式存储的,当我们打开这个文件时,这个文件在加载到内存的时候会转变为Unicode编码方式。

2.浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器(所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码。):

web-utf-8

参考:https://www.cnblogs.com/busui/p/9340339.html

下篇文件主要介绍一下python3 中的编码和解码相关内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter+ForEach控制器+BeanShell取样器+BeanShell PostProcessor爬取网站信息储存csv

1、正则提取器ForEach控制器BeanShell PostProcessorBeanShell 取样器&#xff0c;爬取网站信息并写入到csv中 2、访问网站设置 3、正则提取设置&#xff0c;匹配数字-1代表提取所有符合条件的信息 4、ForEach控制器设置迭代每次提取出来的信息 5、BeanShell PostProcessor设置…

【Python】python3编码方式encode介绍

上一篇文章介绍了计算机编码发展历史和编码方式&#xff0c;现在我们聚焦到python语言中&#xff0c;在最新的Python3版本中&#xff0c;字符串是以Unicode编码的&#xff0c;也就是说&#xff0c;Python的字符串支持多语言。例如&#xff1a; print(我喜欢 computer.encode(u…

telnet用法 测试端口号是否可以使用

方法 1 首先打开控制面板 2 点击程序 3 点击程序与功能 4 点击左边启用或关闭windows功能 5 在telnet客户端打上勾 点击确定 6 winr打开运行 输入cmd 7 打开后输入telnet ip 端口号 如果出来其他窗口则说明这个端口可用。若出现超时&#xff0c;说明这个端口不可用 前提…

阿里云 Ubuntu上的mysql运行sql文件来创建表

1、上传sql文件到指定目录 2、登录数据库 mysql -u root -p 3、查看数据库 show databases; 4、创建数据库 create database wlh; 5、对新创建的数据库操作 use wlh; 6、导入sql文件 7、查看数据库中表格 若有你数据库中的表格则导入成功 8、退出数据库操作 或者用quit; …

linux Ubuntu安装ftp并将本地文件上传到云服务器

确认是否已经安装ftp pgrep vsftpd无结果如下图&#xff1a; 2、执行安装 3、查看ftp是否安装成功 systemctl status vsftpd.service 4、 &#xff08;1&#xff09;新建"/home/uftp"目录作为用户主目录 打开"终端窗口"&#xff0c;输入"sudo mkd…

【Python】PyCryptodome模块中5种AES加密模式介绍

分组密码有五种工作体制&#xff1a; 1.电码本模式&#xff08;Electronic Codebook Book (ECB)&#xff09;&#xff1b; 2.密码分组链接模式&#xff08;Cipher Block Chaining (CBC)&#xff09;&#xff1b; 3.计算器模式&#xff08;Counter (CTR)&#xff09;&#xff1b…

阿里云root密码修改

一、root密码修改阿里云linux服务器修改root密码流程&#xff1a; 通过Xshell客户端输入账号root&#xff0c;输入密码&#xff0c;登陆到linux。 输入修改密码的命令 passwd 根据提示输入新密码&#xff0c;输入新密码的时候&#xff0c;软件不会显示*号&#xff0c;输入后…

【Android】Windows环境安装Android Studio教程

Android Studio 是谷歌推出的一个Android集成开发工具&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 在IDEA的基础上&#xff0c;Android Studio提供&#xff1a; 基于Gradle的构建支持 Android…

【Android】Android Studio打包生成正式签名的APK

Android Studio是谷歌推出一个Android集成开发工具&#xff0c;基于IntelliJ IDEA。它类似于Eclipse ADT&#xff0c;Android Studio 提供了集成的Android开发工具用于开发和调试。 那么今天我们就来讲讲如何通过Android Studio打包APK文件&#xff0c;相信有很多人还不是非常了…

【Android】Android Studio中新创建的app目录结构

安装Android Studio后&#xff0c;然后创建一个app项目。对于初学者来说&#xff0c;我们希望了解app目录结构&#xff0c;然后更好的进行开发工作。 但是要想了解一个app的目录结构&#xff0c;首先需要明确两个概念 Project Name:工程项目名称 Application Name:当前app发布…

mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决

mysql添加用户及权限报错&#xff1a; 出现这样错的原因有两个&#xff1a; 1、语法有问题 &#xff08;这里没有问题&#xff09; 2、mysql版本是否支持 此种写法 找到一位大神说&#xff1a;你检查下mysql版本是mysql server 8.不支持同时创建用户和授予权限&#xf…

djangohttp://127.0.0.1:8000/media/test.jpg直接显示图片media配置

文件目录如下&#xff1a; 1、在settings中加入&#xff1a; STATIC_URL /static/ STATICFILES_DIRS (os.path.join(BASE_DIR,static),) #MEDIA_DIR &#xff08;主要用于获取路径&#xff09; MEDIA_DIR os.path.join(BASE_DIR,media) # 需要加入的MEDIA_DIR路径变量 #ME…

【Python】pandas模块中更改Series的数据类型

今天我们主要解决以下实际问题&#xff1a;一份黑名单数据存储在excel中&#xff0c;由于数据量庞大&#xff0c;现需要通过pandas找到某一列的重复数据&#xff0c;处理后再存入到excel中。 pandas 是基于NumPy 的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的,主…

ubuntu Django项目后台不挂断运行之screen命令

1、安装screen apt install screen 2、新建一个screen screen -S web这样就会新开一个窗口。cd到你需要的目录然后输入你想输入的命令。输入&#xff1a; python manage.py runserver 0.0.0.0:80 3、重新开一个窗口&#xff0c;列出所有screen进程 screen -ls4、如果之前的s…

【Python】Paramiko模块在Windows10中import ssl报错的处理方法

上一篇文章【Python】Paramiko模块实现Linux服务器远程文件操作 介绍了如何通过Paramiko进行 sftp的操作&#xff0c;但最近遇到一个问题&#xff0c;换上家里的windows10电脑后&#xff0c;执行脚本时发现报错&#xff1a;\lib\site-packages\cryptography\hazmat\bindings\op…

【Jmeter篇】Linux环境下安装部署运行Jmeter

JDK安装和配置 1、使用yum线上安装jdk1.8 yum -y list java* #浏览线上所有jdk版本列表 yum -y list java-1.8*#浏览线上jdk1.7版本列表 yum -y install java-1.8.0-openjdk* #下载安装jdk1.8套件 java -version #检查是否安装成功 2、配置全局环境变量 which java ls -…

【Python实战】使用python批量生成发票

一般的贸易或者货运型公司&#xff0c;经常需要做发票&#xff0c;有时候我们会遇到需要做大批量重复性的发票时&#xff0c;如果人工一个个去做&#xff0c;即耗时而且容易出错&#xff0c;这时我们可以用的python和excel相关的模块去批量生成。 现在有这样一个场景&#xff…

【PS】如何将截图获取的印章迁移到新图片上

有时候我们需要特殊签名或者合同印章时&#xff0c;可以通过其他图片上截图后&#xff0c;经过处理后放置到新的图片上&#xff0c;这个时候我们可以通过ps进行处理&#xff0c;主要三个流程&#xff1a; 1.截取需要的签名或印章&#xff0c;用ps消除多余的信息&#xff1b; 2…

【Jmeter篇】Jmeter分布式调度压测部署

Jmeter 是java 应用&#xff0c;对于CPU和内存的消耗比较大&#xff0c;因此&#xff0c;当需要模拟数以千计的并发用户时&#xff0c;使用单台机器模拟所有的并发用户就有些力不从心&#xff0c;甚至会引起JAVA内存溢出错误。为了让jmeter工具提供更大的负载能力&#xff0c;j…

【工具】FTP软件FileZilla下载和连接服务器

作为一名偏后台程序测试的测试工程师&#xff0c;经常会接触运维相关工作&#xff0c;与服务器打交道。 一般公司会搭建内网环境和外网环境&#xff0c;项目开发、SIT测试主要是在内网环境做&#xff0c;然后等到UTA、预投产阶段在外网环境。 如果公司业务量大&#xff0c;多个…