首页 > 代码库 > 4.python2与python3编码区别,以及字符串与字节的相互转换及其socket编程应用场景

4.python2与python3编码区别,以及字符串与字节的相互转换及其socket编程应用场景

知识点剖析

1.python2与python3的某些区别

  其实一直想写这篇博客,实则在socket编程中,字符串,字节(byte),和bit流把我弄得晕头转向。确实这也是python3与python2的区别所在。我想在12期的时候,刚从python2转到python3的沛齐与Alex老师也是十分头疼,最近几天查看了相关资料与视频,才恍然大悟。

  首先我们看一下下面的实例:

  技术分享技术分享

 

原因:在python2.7中,for循环遇到汉字,依然会按照字节进行循环,那么3个字节才能组成的汉字,单个输出只能时乱码。

   解决方法就是在输出的时候,没3个字节输出一次,但是这样显得特别繁琐。

那么在python3.5中是以怎样的形式进行输出呢?

     技术分享 技术分享

   在python3中,我们对输出的元素进行了封装,统一按字符输出,"111"是3个字符组成了字符串,"aaa"是3个字母组成的字符串,

"吴文"是由两个汉字字符组成的字符串,但是对于单个字符的汉字来说,python3还是以utf-8的形式编码,在内存中,它依然占有

3个字节,只是输出的时候,将3个字节封装成一个字符统一的输出,这是python3在python2上的改进之一。

 

沛齐老师说下面这个题,面试可能会考到

输出名字对应的二进制形式

name = "吴文"
for i in name:
    print(i)
    bytes_list = bytes(i, encoding=utf-8)
    print(bytes_list)
    for b in bytes_list: 
        ‘‘‘对于这个for循环,b‘\xe5\x90\xb4‘为一个3个字符组成的字符串
        只是每个字符是由2位二进制表示的8位的二进制的字符而已
        ‘‘‘
        print(b, bin(b)) #默认输出为10进制,bin()的用法也是将10进制表示为2进制

结果:

          技术分享

2.str类型与bytes类型的互相转换以及其应用场景。

tips:在python2中,bytes没有意义,因为多数场景,它本身是按字节来执行的

#将字符串转换成字节
a = "吴文"
b = bytes(a, encoding=utf-8)
print(b)
b1 = bytes(a, encoding=gbk)
print(b1)

#将字节转换成字符串
a1 = str(b, encoding=utf-8)
print(a1)
a2 = str(b1, encoding=gbk)
print(a2)

结果:

技术分享

2.1应用场景:socket编程

技术分享

图做的有点不规范了,因为脱离了主机后,它已经是bit流了,在这里只是为了展示一个汉字应该发生的变化,

这些变化出了计算机就只剩下电信号了。

4.python2与python3编码区别,以及字符串与字节的相互转换及其socket编程应用场景