【编码】2 python3中编码转换的问题

前文【编码】1常见的字符编码基础https://blog.csdn.net/kongzhian/article/details/110186522

今天在回顾编码知识时,发现了python2和python3在处理编码转换时的不同之处,花了一点时间总结了一下python编码转换的问题

python2中的编码转换

把8个二进制一组称为一个byte,用16进制来表示。为的就是让人们看起来更可读。我们称之为bytes类型,即字节类型。在python2中,str=byte

python2可直接将字符串用hex编码

s = 'test'
print(s.encode('hex'))

另外,python2的默认编码是ASCII码,但这并不支持汉字、日文、法语等语言,于是python引入unicode,由于很多软件就是基于之前的默认编码ASCII开发的,直接把默认编码改成unicode的话是不现实的。故Python2就直接搞了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型。

>>> s = "路飞"
>>> s
'\xe8\xb7\xaf\xe9\xa3\x9e'
>>> s2 = s.decode("utf-8")
>>> s2
u'\u8def\u98de'
>>> type(s2)
<type 'unicode'>

有时候,python2中的默认编码可能是gbk

简而言之,在python2中,unicode就是一个“中间商”,gbk和utf-8 转换要通过unicode类型,且想要正常显示中文的话,必须转换成unicode类型 

同样,ascii也可以转变成Unicode类型

故在有以下关系

 

python3中编码转换

在python3中默认编码变为unicode(双字节编码但不是unicode类型),故可以正常显示中文,但不像默认编码是ascii/gbk/utf-8的python2可以直接socket传输,而python3需将默认unicode编码转成字节流gbk/utf-8

注意gbk/utf-8和unicode的区别,gbk一般情况是双字节(与ascii对应时是单字节),这个时候gbk由两个字表示,即一字节=一字,unicode虽然也是双字节,但unicode由一个字组成,即在unicode中,一字=两字节。

注:SQL宽字节注入发生在gbk反编译中

# 转换方式有三种

s1 = b'nihaom'#这个只用于可以被ascil编码的字符,即字母数字符号(只是可被ascii编码,本质上还是unicode编码)

s2 = '你好吗'

s2 = bytes(s2, encoding='utf-8')   # 反转换 bytes.decode(bs,encoding='utf8')

s3 = '我很好'

s3 = s3.encode('utf-8')

print(s1, s2, s3) #

哈希编码与bytes之间的转换:(若想转换成hex编码,需先进行str=>bytes,或者说unicode=》utf-8的转换)

转为hex编码:bytesTest.hex()   hex编码转为bytes:bytes.fromhex(hexTest)

print(s2.hex(),bytes.fromhex(s2.hex())) 

 a='我很好'

####python3 默认的编码为unicode,以unicode为中间媒介转换

###unicode>gb2312

unicode_gb2312=a.encode('gb2312') ###因为默认是unicode所以不需要decode(),直接encode成想要转换的编码如gb2312

print('我的gb2312',unicode_gb2312) ###返回结果: 我的gb2312 b'\xce\xd2\xba\xdc\xba\xc3'

###gb2312>utf8

gb2312_utf8=unicode_gb2312.decode('gb2312').encode('utf-8') ##当前字符为gb2312所以要先decode成unicode(decode中传入的参数为当前字符的编码集)然后再encode成utf-8

print('我是utf-8',gb2312_utf8) ###返回结果: 我是utf-8 b'\xe6\x88\x91\xe5\xbe\x88\xe5\xa5\xbd'

###utf8>gbk

utf8_gbk=gb2312_utf8.decode('utf-8').encode('gbk')##当前字符集编码为utf-8要想转换成gbk先decode成unicode字符集再encode成gbk字符集

print("我是gbk",utf8_gbk) ###返回结果: 我是gbk b'\xce\xd2\xba\xdc\xba\xc3'

###utf8>uicode

utf8_unicode=utf8_gbk.decode('gbk') ####注意当转换成unicode时 并不需要encode()

print('我是unicode',utf8_unicode) ###返回结果: 我是unicode 我很好

###unicode>gb18030

unicode_gb18030=utf8_unicode.encode('gb18030')

print('我是gb18030',unicode_gb18030) ###返回结果: 我是gb18030 b'\xce\xd2\xba\xdc\xba\xc3'

###总结各个编码的互相转换都要先转换成unicode然后通过unicode再转换成想要的编码

##从上面可以看出gb2312 ,gbk,gb18030返回的结果都是一样的,那是应为这3个都是中国的编码,所以都是向下互相兼容的

 

参考:https://www.cnblogs.com/ccnaie/p/6832430.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值