python字符编码

编码,就是文字和二进制之间的一个对照表。

ascii编码

最早计算机诞生之初,就产生的编码,ascii规定使用1个字节来表示字母与二进制的对应关系。
例如:

A   01000001
B   01000010

总共有 2 8 = 256 2^8=256 28=256 个编码。对于一些语言是不够的。

gb-2312编码

gb-2312编码,由国家信息标准委员会制作(1980年)。
gbk编码,对gb2312进行扩展,包含了中日韩等文字(1995年)。

在与二进制做对应关系时,由如下逻辑:

  • 单字节表示,用一个字节表示对应关系。2**8 = 256
  • 双字节表示,用两个字节表示对应关系。2**16 = 65536中可能性。

unicode

unicode也被称为万国码,为全球的每个文字都分配了一个码位(二进制表示)。

有两种表示方式:

  • ucs2
用固定的2个字节去表示一个文字。

00000000 00000000     悟
...

2**16 = 65535
  • ucs4
用固定的4个字节去表示一个文字。
00000000 00000000 00000000 00000000  无
...
2**32 = 4294967296
文字     十六进制            二进制 
 ȧ        0227           1000100111
 ȧ        0227         00000010 00100111                       ucs2
 ȧ        0227         00000000 00000000 00000010 00100111     ucs4
 
 乔       4E54           100111001010100
 乔       4E54         01001110 01010100                       ucs2
 乔       4E54         00000000 00000000 01001110 01010100     ucs4
 
 😆      1F606        11111011000000110                                    
 😆      1F606                 无                                                无法用ucs2 进行表示
 😆      1F606        00000000 00000001 11110110 00000110      ucs4

无论是ucs2和ucs4都有缺点:浪费空间。

例如:

文字     十六进制     二进制
A        0041      01000001
A        0041      00000000 01000001
A        0041      00000000 00000000 00000000 01000001

utf-8

包含所有文字和二进制的对应关系,全球应用最为广泛的一种编码(站在巨人的肩膀上功成名就)。

本质上:utf-8是对unicode的压缩,用尽量少的二进制去与文字进行对应。

  unicode码位范围            utf-8      
   0000 ~ 007F              用1个字节表示
   0080 ~ 07FF              用2个字节表示
   0800 ~ FFFF              用3个字节表示
  10000 ~ 10FFFF            用4个字节表示

python相关编码

v = 'abc' # Python内部会使用unicode对abc进行处理,在进行网络传输或者内存处理的时候,需要转成字节(byte)进行处理,这时就需要使用utf-8进行编码

v1 = 'test' # python 内部使用unicode ucs4进行编码,存储在硬盘时,需要将字符串转换为字节,就需要将unicode转成utf-8
v2 = v1.encode('utf-8')

例如将字符串写入到一个文件中:

# type(name) 为str类型
name = "hello world"  # 默认是字符串unicode编码,写入文件需要转为字节utf-8
# type(data) 为bytes类型
data = name.encode('utf-8')
file_obj = open('log.txt', mode='wb')
file_obj.write(data)
file_obj.close()

如果不进行转化name.encode('utf-8'),那么运行会报错:TypeError: a bytes-like object is required, not 'str'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值