文章中的部分照片来源于哔站
黑马程序员阿伟老师
处,仅用学习,无商用,侵权联系删除!
字符集
是一种将字符映射到数字编码的规则集合,用于在计算机中表示和存储文本数据。不同的字符集定义了不同字符与数字编码之间的对应关系,以支持不同语言的文字、符号和特殊字符。
1. 计算机存储规则
计算机存储规则
是指计算机系统中用来存储数据的方式和规则。
常见的计算机存储规则包括:
-
数据存储单位:计算机中数据存储的最小单位是位(bit),8位组合成一个字节(byte)。常见的存储单位还有千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)等。
-
存储层次结构:计算机存储设备按照速度和容量的不同可以划分为不同层次,如寄存器、缓存、内存和硬盘等。
-
存储地址:每个存储单元都有一个唯一的地址,通过地址可以访问和存储数据。
-
存储访问速度:存储器的访问速度通常按照存取时间(Access Time)来衡量,不同存储设备的存取时间不同。
-
存储结构:存储设备有不同的结构,如随机存储器(RAM)、只读存储器(ROM)、磁盘、固态硬盘等。
GB2312字符集
:1980年发布,1981年5月1日实施的简体中文汉字编码国家标准。收录7445个图形字符,其中包括6763个简体汉字
BIG5字符集
:台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施。
GBK字符集
:2000年3月17日发布,收录21003个汉字。
包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
windows系统默认使用的就是GBK。系统显示:ANSI
Unicode字符集
:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。
2. ASCII
字符集
ASCII
(American Standard Code for Information Interchange,美国信息交换标准代码)字符集是一种使用8位二进制数(前面补0,补齐八位
)表示的字符编码标准,定义了从0到127的127个字符,包括控制字符(如换行符、回车符)和可打印字符(如数字、字母、符号等)。
只能存储
ASCII
码表里面的字符,一个英文占一个字节。
-
存储规则:
-
ASCII字符集使用8位二进制数(共128个不同的组合)来表示每个字符。
-
每个字符都有一个唯一的ASCII码,范围从0到127。
-
ASCII字符集可以存储在计算机的内存中,并且可以被存储在文本文件中。
-
-
编码规则:
-
将 ASCII 字符表示为8位二进制数(前面补0,补齐八位)。
-
通过 ASCII 表可以查找到每个字符对应的 ASCII 码。
-
例如,大写字母"A"对应的 ASCII 码为65(二进制表示为01000001)。
-
- 解码规则:
-
将二进制 ASCII 码转换回对应的字符。
-
将存储在计算机中的 ASCII 码转换为可读文本。
-
相反地,将字符转换为对应的 ASCII 码。
-
3. GBK
字符集
GBK
(Guo Biao Kuaiji,国家标准信息交换码)是中文编码字符集之一,用于表示中文字符和部分符号。GBK是对汉字进行编码的标准之一,支持简体中文、繁体中文以及一些其他语言的文字。
-
存储规则:
-
GBK字符集使用多字节表示汉字和其他特殊字符,通常采用双字节编码。
-
第一个字节范围为0x81-0xFE,第二个字节范围为0x40-0xFE(剔除0x7F),每个字节的取值范围是0x00-0xFF,其中包含了汉字和其他特殊字符。
-
-
编码规则:
-
每个中文字符编码为两个字节的形式存储。
-
高位字节二进制一定以
1
开头,转换成十进制之后是一个负数(用于区分是中文还是英文)。 -
GBK编码使用了第一个字节和第二个字节的范围来确定具体的字符。
-
-
解码规则:
-
根据双字节编码应用相应的解码算法,将每两个字节解析为一个字符。
-
解码时需要考虑字节的顺序和编码范围,以正确还原原始的字符。
-
-
对比
-
计算机的存储规则(汉字)(GBK)
-
规则1:汉字两个字节存储
-
规则2:高位字节二进制一定以1开头,转成十进制之后是一个负数
-
-
计算机的存储规则(英文)(GBK)
- 规则:英文一个字节存储,兼容ASCI,二进制前面补0
-
-
核心
-
核心1:GBK中,一个英文字母一个字节,二进制第一位是0
-
核心2:GBK中,一个中文汉字两个字节,二进制第一位是1
-
4. Unicode
字符集
Unicode
字符集是一种全球通用的字符编码标准,旨在为世界上所有的文字和符号提供唯一的数字编码。Unicode定义了超过130,000个字符,涵盖了几乎所有的书写系统以及许多特殊符号。
-
存储规则:
-
Unicode字符集使用不同位数的编码单元来表示字符,常见的编码单元包括UTF-8、UTF-16和UTF-32。
-
UTF-8编码单元长度可变(1至4字节),UTF-16使用16位编码单元(2字节或4字节),UTF-32使用32位编码单元(4字节)。
-
Unicode字符在计算机内存中存储时,会根据所选的编码单元进行存储。
-
-
编码规则:
-
使用UTF-8、UTF-16或UTF-32等编码格式将Unicode字符转换为相应的编码单元序列。
-
不同编码格式根据规范来分配不同长度的编码单元,确保将所有Unicode字符编码为二进制数据。
-
-
解码规则:
-
将存储在计算机中的Unicode编码数据反向解析为字符。
-
根据所选的编码格式,将编码单元序列解码为原始Unicode字符。
-
编码和解码过程需要确保编码单元的顺序和长度符合Unicode编码规范,以正确地表示和还原字符。
4.
UTF-8
编码方式(二进制)- UTF-8编码规则:用1~4个字节保存
-
英文:1个字节
-
中文:3个字节
-
-
字节个数 | 表示形式 |
---|---|
一个字节 | 0 xxxxxxx(ASCII码) |
两个字节 | 110 xxxxx 10 xxxxxx |
三个字节 | 1110 xxxx 10 xxxxxx 10 xxxxxx |
四个字节 | 11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx |
5. 乱码原因
-
原因1:读取数据时未读完整个汉字
- 例如
- 例如
-
原因2:编码和解码时的方式不统一
- 例如:UTF-8编码汉字一次读取3个字节;GBK解码汉字一次读取2个字节
- 例如:UTF-8编码汉字一次读取3个字节;GBK解码汉字一次读取2个字节