一文搞懂计算机字符编码

本文详细介绍了ASCII编码的基础概念、应用、ASCII编码表及其局限性,接着探讨了GBK编码针对中文的支持以及Unicode编码的全球统一性,最后聚焦于UTF-8编码的变长特性。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

一文搞懂计算机字符编码

一,ASCII

1,ASCII编码简介

字符的存储主要依赖于编码方式 对于英文字符最主要的就是 ASCII编码(美国信息交换标准代码),
ASCII编码是一种基于128种字符的编码方式,其中包括了数字,字母,标点符号,控制字符等。
使用7位表示一个字符 0000000-1111111 2^7 其取值范围为0-127 因此最多能表示128个字符,
所以ASCI编码中每个字符使用一个字节的空间存储 
首位作为奇偶校验位(代码传送过程中用来检验是否出现错误)ASCII编码将一个字符存储为一个字节,
简单地说ASCII编码就是将一个字符映射到二进制数的表格

2,ASCII编码的应用

1,文本表示 将文本字符转换为二进制数表示,方便计算机存储和处理
2,文件格式 如TXT文本文件就是用ASCII编码保存的纯文本文件
3,远程访问 远程服务器登录和交互也是基于ASCII编码实现的。
4,输入法 许多输入法也是用ASCII编码作为基础编码方式,用于识别用户输入的字符,从而进行文本输入和编辑。

3,ASCII编码表

ASCII值0-31,127 是控制字符或通信专用字符 如LR(换行) CR(回车) DEL(删除) ACK(确认)32-126是字符 48-570-9阿拉伯数字) 65-90(大写英文字母) 97-12226个小写字母)其余为一些标点符号,运算符号。
https://blog.csdn.net/m0_46502538/article/details/119735772

4,ASCII编码的缺点

1,只能表示128种字符无法表示一些特殊字符和非拉丁字母 因此后来出现了一些扩展的编码方式 unicode utf-8
2,不够安全 容易被中间人攻击篡改和窃取数据 为了加强数据的安全性 出现了一些加密和安全协议 如SSL/TLS协议等

5,获取字符的ASCII编码值

char = 'a'
ascii_value = ord(char)
print(ascii_value)

二,GBK

1,GBK编码简介

由于ASCII编码是不支持中文的,但又需要寻求一种编码方式来支持中文,于是国人就定义了一套编码规则,
当字符小于127位时,与ASCII字符相同,当两个大于 127的字符连接在一起时,就代表一个汉字。
第一个字节称为 高字节 第二个字节称为低字节 这样大概可以组合7000多个简体汉字,这个规则叫做GB2312。
由于中国汉字很多,有些字还是无法表示,于是重新定义规则:不再要求低字节一定是127之后的编码,只要是第一个字节大于127,就固定表示这是一个汉字的开始,
这种扩展之后的编码称为GBK 包含了GB2312的所有内容同时新增了20000个新的汉字,所以GBK编码将一个字符存储为两个字节。
GBK的编码范围:16进制表示:8140-FEFE     
8421码表示:1000000101000000-1111111011111110
ps:8421BCD码:每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字,16进制里的 ABCDEF 分别表示10 11 12 13 14 15 
0000 0000 0000 0000 F:15=8+4+2+1 E:14=8+4+2

2,GBK编码表的组成

1,汉字区: 收录GB2312汉字6763个 收录GB13000.1中的CJK汉字6080个 收录CJK和增补的汉字81602,图形符号区
3,用户自定义区: AAA1-AFFE 564个 F8A1-FEFE,码位 658 个 A140-A7A0,码位 672 个
https://blog.csdn.net/WuLex/article/details/105766953

3,获取字符的GBK编码值

chinese_str = "你"
gbk_encoding_hex = binascii.hexlify(bytes(chinese_str, 'gbk')).decode('utf-8')
print(gbk_encoding_hex)

三,UNICODE

1,unicode编码简介

因为世界上有很多编码,而每一个国家都定义一套自己的编码,结果互相之间无法解析编码进行通信,
所以国际标准化组织决定定义一套编码方案来解决所有国家的编码问题,这个新的编码方案就叫做 Unicode。
他并不是一个新的编码规则,而是一套字符集(为每一个字符分配一个唯一的ID,学名为码位/码点/code point)
因为unicode只是一个字符集,编码范围是 0x0000 - 0x10FFFF,只规定了每个符号的二进制代码,却没有规定这个二进制代码应该如何存储。
如果一个汉字需要三个字节存储 计算机并不知道这三个字节是表示一个符号而不是分别表示三个符号,
因为英文只需要一个字节表示,如果规定每个符号都用三或四个字节表示,
那么每个英文字母前面必然有两到三个字节的全为0 这样会对存储产生极大浪费,这样造成的结果是 
unicode出现了很多的存储方式,也就是说有很多不同的二进制格式,
所以unicode在很长一段时间内无法推广,直到utf编码的出现。

2,获取字符的unicode编码值

chinese_str = "汉"
gbk_encoding = ord(chinese_str)
bin_str=bin(gbk_encoding)
hex_str=hex(gbk_encoding)
print(bin_str)
print(hex_str)

四,UTF-8

1,utf-8编码简介

由于unicode比较浪费网络和硬盘资源,因此为了解决这个问题就在unicode的基础上定制了一套编码规则,
最大特点是 可变长,可以用1-4个字节表示一个字符,具体取决于码点数值中有效二进制位的数量。
对于单个字节,第一位设为0 后面7位对应这个字符的unicode码点,
因此,对于英文的0-127号字符,与ASCII码完全相同。
对于需要使用N个字节来表示的字符(N>1) 第一个字节前N位都设为1 第N+1位设为0 
剩余的N-1个字节的前两位都设为10 剩下的二进制位则使用这个字符的unicode码位填充
Unicode 十六进制码点范围	UTF-8 二进制
0000 0000 - 0000 007F	0xxxxxxx
0000 0080 - 0000 07FF	110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF	1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF	 
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面以 "中" 字 为例来说明 UTF-8 的编码
中字的unicode编码为 4E2D      0100111000101101
根据上述对应表可知  '中'字的UTF-8编码需要三个字节 
1110xxxx 10xxxxxx 10xxxxxx   从'中字'最后一个二进制位开始,
按照从后往前顺序依次填入格式中的x字符,多出的二进制补011100100 10111000 10101101   
转换为16进制为   E4B8AD
1110   E
0100   4
10111 B
1000   8
1010   A
1101   D
检验是否正确
chinese_str = "中"
gbk_encoding_hex = binascii.hexlify(bytes(chinese_str, 'utf-8')).decode('utf-8')
print(gbk_encoding_hex)   #e4b8ad

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值