关于编码的⼀些问题
位 / 字节 / 字符
位 ( bit ) : 计算机最⼩存储单位, 以⼆进制0和1表⽰
字节 ( Byte ) : 是基本计量单位 1byte = 8bit, 也就是说计算机以每字节也就是8位⼆进制数字进⾏储存, 换句话说只要写⼊⾄少是⼀个字节也就是8位⼆进制.
字符 ( Character ): 通常⼈们使⽤的⼀种记号, 是⼀种抽象意义上的符号实体
为什么 1 byte = 8 bit
早起出现过 4 6 7 位表⽰⼀个字节的编码, 私以为计算机是以2的次⽅表⽰⼤整数, ⽐如 2 4 8 16 , 位的概念在先 ascii 概念在后, 表⽰ascii 表的全部符号⾄少需要⽤ 7 位⼆进制, 后来因为推⼴的需要扩充⾄256 这时候⾄少要 8 位才能涵盖所有的ascii符号, 所以取2^3 = 8位表⽰⼀个字节⽐较通⽤
字符表 / 编码字符集 / 字符编码表 / 字符编码⽅案
字符表 ( Character repertoire ) : ⼀些抽象字符的集合
编码字符集 ( Coded Character Set ) : 给集合⾥⾯的每个抽象字符编上⼀个数字编号(字符码), 这种⼀⼀对应的映射关系构成编码字符集, Unicode 属于这⼀层级, 它与编码以及存储⽅式没有关系
字符码( Code Point ) : 字符码(Code Point)指的是字符集中每个字符的数字编号,例如 ASCII 字符集⽤ 0-127 连续的128个数字分别表⽰128个字符,例如 “A” 的字符码编号就是65。
字符编码表( Character Encoding Form ) : 将映射的数字编号( 字符码 )按照某种编码规则转换成固定长度的⽐特值, 便于计算机以⼀定长度的⼆进制表⽰该整数, 这种对应的关系形成了字符编码表
字符编码⽅案( Character Encoding Scheme ) : 对于CEF得到的⽐特值具体如何在计算机中进⾏存储,传输。因为存在⼤端⼩端的问题,这就会跟具体的操作系统相关了。这种解决⽅案称为字符编码⽅案
常⽤字符集以及字符编码
常⽤字符集 : Ascii Big5 GBK GB2312 Unicode
常⽤字符集编码 : ascii big5 gbk gb2312 utf8
字节与字符之间的关系
ascii是几位二进制编码
⼤约多少个字节可以描述⼀个具体的字符, 根据编码的⽅式不同⽽不同, ASCII 中⼀个字节表⽰⼀个字符, GBK 中两个字节表⽰⼀个字符, UTF8 中3个字节表⽰⼀个汉字
我们看到的字 -> 字符 -> 字节 -> 位他们之间的关系
计算机从硬盘读取⼆进制数据⾄内存, 此时并不知道这些⼆进制数据是以什么编码⽅式储存的, 因此我们需要⾃动或⼿动选择编码⽅式进⾏解码以⽅便接下来的操作, 如果选择的编码是 UTF8 那么将以这种编码进⾏解码成相应的字节数组, 但是也仅仅是⼀个数组这些⾃⼰具体表⽰什么内容并没有划分出多少字节为⼀个字符单位, 这个概念就相当于⼀个字节单位有⼋个⽐特,⼀个字符单位有⼏个字节的道理⼀样, 然⽽尽管划分了多少字节表⽰⼀个具体的字符, 也仅仅是⼀个Unicode中的数字编号(代码点)这些代码点需要映射成具体哪个字体中图形字符⼈类才可以正常阅读并识别
strings = '这是⼀个字符串'
# 转换成数组
bytes = de('utf-8')
# b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
# 接下来我们看看他们的切⽚是以什么为单位的
strings[0] # "这" 这个字符其实是 \xe8\xbf\x99 跟字体表映射后的图形
bytes[0]  # 232 正好是⼗六进制的 \xe8
讲讲Unicode 与 UTF8 之间的关系
Unicode 是编码字符集, 其实就是编了号的字符映射集合⽐如:
a -> 1
b -> 2
...
UTF8 是字符编码表, 它规定了Unicode集中编号( 字符码 )⼆进制的数据的转换关系, ⽐如:
# 对于字符“诗”,对应的UNICODE码点、UTF-XXX编码为:
CHAR  : 诗
UNICODE: u+8bd7
UTF-8  : 0xe8af97
UTF-16 : 0x8bd7
UTF-32 : 0x00008bd7
# 他们是如何转换的
UNICODE u+8bd7
对应⼆进制 10001011 11010111
按4/6/6分组 1000 101111 010111
UTF8的模板 1110xxxx 10xxxxxx 10xxxxxx
填充⾄模板 11101000 10101111 10010111
转换成⼗六进制 E8 AF 97
转换成⼗进制 232 175 151
python 中编码与解码
编码是指将字符串编码成字节流, 解码是指将字节流解码成字符串
strings = '诗'
# 以 UTF8 编码⽅式编码成字节流
bytes = de('utf-8')
# 将字节流(数组) 解码成字符串
bytes.decode('utf-8')
# 最终得到的结果 : '诗'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。