边看视频讲解,计算机内部是怎么存储的?

 2024-01-08 03:01:45  阅读 0

我们肉眼看到的计算机上显示的文字有汉字、英文、日文、韩文。 这些字符在计算机内部是如何存储的呢?

上面刻着吗? 比如硬盘上刻着这样的字?

当然不是,计算机使用数字来存储信息。

利用磁场、电信号等物理介质的正负状态来表示0和1。如果一个数字只用0和1来表示,那么它就是二进制数表示。

使用连续的 0 和 1,可以表示非常大的数字。

例如

二进制10表示十进制2

二进制110表示十进制6

从右到左,每一位上的 1 代表 2 的 0 次方(即 1)、2 的 1 次方(即 2)、2 的 2 次方(即 4)和 2的 3 次方(即 8)。 ) 等等等等。

数字根据不同的使用情况可以代表不同的含义。

例如,当需要存储颜色信息时,可以用0代表白色,1代表红色,2代表黑色,等等。

如果有10000种颜色,总共可以用0到9999的10000个数字来分别表示。

同样,如果我们要存储文本信息,我们也可以用不同的数字来表示不同的文本。

字符集

点击此处观看视频讲解并了解以下内容

计算机是美国人发明的,所以一开始他们并没有指望将来能够支持全世界的文字。

因此,他们最早定义了一个规范,定义了一些数字来代表美国人使用的文字符号。

美国人的单词都是用字母拼写的,所以他们使用的基本文字符号较少。

光是字母,加上!@#$%^&*(){[]}+-等符号,就有一百多个。

他们定义的标准叫ASCII(Code for),中文大致意思是美国信息交换标准码。

可以参考百度上的ASCII表

该ASCII码使用128个数字来表示128个字符。

这128个字符对应的文本信息的存储和传输也非常简单。 8 个二进制位就足够了。

因为2的8次方等于256,所以总共可以存储0到255的256个数字,最多可以表示256个文本符号。

二进制字节的长度为 8 位,称为字节。

所以一个字节可以存储任何ASCII文本符号。

ASCII 是一种使用数字表示文本符号的标准,称为字符集。

支持中文字符的编码有_编码字符中文支持有几种_哪些编码支持中文字符

后来,计算机遍布世界各地,其他国家也有了更多的文字和符号。

我们的汉语有很多文字和符号。 我上小学的时候,我们有一张3000个常用单词表(我很自豪我小学一年级就认识了近2000个单词),光是常用单词就有3000个了。

当然还有韩语、日语、繁体中文、阿拉伯语等。

显然ASCII是不够的,我们需要其他数字来表示这些文本符号。

起初,每个国家和地区都定义了自己的字符集。

例如,中国定义了另一套规范,规定用什么数字来表示什么文字符号。

这套规范也在不断升级,包括GBK、

每个国家都定义了每个国家文本的字符集,这就带来了一个问题。

如今,全球交流非常密切,有时一篇文章会使用多种语言,例如同时使用日语和中文。

各国的字符集往往不包含其他国家的字符。 例如,GBK 不包含日语。

此时,一篇文章中存储多种语言是不可能的。

为了解决这个问题。 国际标准化组织定义了一个字符集,其中包括世界上所有的文本符号。

这就是著名的字符集。

该字符集包括当今世界常用的文本符号及其相应的数字表示。

这就解决了一篇文章中包含多种语言的问题。

字符编码

点击此处观看视频讲解并了解以下内容

它出现了,很棒,但有一个问题。 字符如何存储和传输。

由于历史原因,计算机以字节为单位存储和传输数据。 一个字节由8位二进制数表示,最多可以表示0到255,总共256个字符。

当一开始只有ASCII码时,一个字节可以存储和传输任何文本。

但里面的文字符号有十万多个,数字的范围远远超过了一个字节可以表示的数量。

所以一个字节是不够的。

那么如何使用多个字节来表示这些数字呢?

这就需要额外的规范。如何用字节来表示对应的字符数,就是字符编码规范。

对于字符编码,最常用的规范是UTF8和UTF16。

例如,UTF8表示汉字“你”,用3个字节表示。 对应的十六进制表示为E4、BD、A0

当然,我们的中文字符集gb系列使用的是另一种编码标准。

以后我们会以UTF8为例写一篇文章来讲解它是如何使用多个字节来存储数字的。

这里我们只需要知道不同的编码标准对于字节数的表达方式是不同的。

有了编码规范,就可以将字符集中的数字转换为字节进行存储和传输。下面是学习视频

字符编码和解码

点击此处观看视频讲解并了解以下内容

字符串编码

我们语言中的字符串对象就是字符串。 实际存储到内存时,使用的是UTF16编码。

但是,我们通常不会将UTF16编码的内容写入磁盘或通过网络传输,因为UTF16编码浪费空间。

特别是如果文本信息基本都是英文符号,utf16就会用2个字节来表示英文符号。 其实1个字节就够了。

因此,当语言需要存储和传输字符串对象时,通常使用方法,参数指定编码方式,编码为bytes对象。

bytes对象的底层使用bytes来存储字符串中的文本。

同一个字符串,使用不同的编码方法,有时会产生不同的字节结果。

例如

print ('你好'.encode('utf8')) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
print ('你好'.encode('gbk'))  # 输出 b'\xc4\xe3\xba\xc3'

输出内容中b开头表示这是一个bytes对象。

\x表示一个字节以十六进制表示

您好,使用utf8编码的字节串,十六进制为6个字节。

e4bda0 对应 你
e5a5bd 对应 好

您好,gbk编码的字节串,十六进制格式为4个字节c4e3 bac3

c4e3 对应 你
bac3 对应 好

该方法返回编码后的字节串对象bytes,可以存储在文件中,也可以编码成字节串对象bytes后传输到网络。后面我们会学习如何进行文件存储和网络传输。

字节串解码

当我们的程序从文件中读取文本信息或者从网络接收文本信息时,获得的数据通常是使用某种字符编码的字节串。

程序通常需要将这些字节串解码为字符串,以便程序能够理解和处理字符信息。

语言解码被解码为字符串对象。

要解码字节字符串,您必须知道字节字符串是用什么字符编码的。

如果知道的话可以使用字节串对象的方法进行解码,参数指定编码方式。

例如

print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8'))
print(b'\xc4\xe3\xba\xc3'.decode('gbk'))

上面两行代码都可以解码字符串“Hello”

如果不小心写错了参数指定的编码方式,可能会返回错误的解码结果,例如

print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('gbk'))
返回 浣犲ソ

或者解码失败,报错,如

print(b'\xc4\xe3\xba\xc3'.decode('utf8'))
报如下错误:
Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

将数字转换为字符的一些字符编码和解码技术

要将数字转换为字符,请使用函数 chr(),例如:

>>> chr(50)
'2'
>>> chr(20013)
'中'
>>> chr(0x4e2d)  # 0x开头表示数字是16进制
'中'

将字符转换为数字

相反,要将字符转换为对应的数字,请使用函数ord()

函数参数字符串中只能有一个字符。

>>> ord('2')
50
>>> ord('中')
20013

字符串编码为转义数字

除了utf8之外,gbk还有一种常见的编码方式叫-,直接用数字串来表示字符,如下图

>>> '白月黑羽'.encode('unicode-escape')
b'\\u767d\\u6708\\u9ed1\\u7fbd'

写入带有转义数字的字符串

>>> '\u767d\u6708\u9ed1\u7fbd'
'白月黑羽'

直接使用十六进制数创建字节

>>> b'\xb0\xd7\xd4\xc2\xba\xda\xd3\xf0'
b'\xb0\xd7\xd4\xc2\xba\xda\xd3\xf0'
>>> b'\xb0\xd7\xd4\xc2\xba\xda\xd3\xf0'.decode('gbk')
'白月黑羽'

字节字符串和以十六进制表示字节的字符串

>>> a = b'hello,123'
>>> a.hex()
'68656c6c6f2c313233'

逆向操作是将十六进制表示字节的字符串转换为字节串。

>>> bytes.fromhex('68656c6c6f2c313233')
b'hello,123'

您需要高效学习、找工作吗?点击咨询报名实践课程。 点击查看学生就业情况。

标签: 字符 字节 编码

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码