Python之路【第九篇】:字符串与字节的相互转换以及2.7与3输出方式的不同
之前提到了编码的问题,我们知道了ASCII码,万国码,utf-8编码。
在开始学习字符串与字节的相互转换之前,需要先补充两个知识点:
bytes类型:这个类型在2.7里面没有,在3里才有,作用是将字符串转换成字节,会返回一个字节的集合,可以迭代的
s = '你好' print(bytes(s,encoding='utf-8'))
输出结果为:
b'\xe4\xbd\xa0\xe5\xa5\xbd'
在使用bytes时,需要加上参数encoding='',来说明是哪种编码方式,因为我们知道,utf-8中,一个汉字占3个字节,而在gbk编码中,一个汉字占2个字节,我们用gbk编码来看一下:
s = '你好' print(bytes(s,encoding='gbk'))
输出结果为:
b'\xc4\xe3\xba\xc3'
对比两个输出结果,不同的编码方式,输出的结果是不一样的,所以我们万不可以忘记encoding参数
bin方法:输出十进制数字的二进制表达式
print(bin(10))
输出结果为:
0b1010
2.7与3输出方式的不同:
2.7版本:
# -*- coding:utf-8 -*-
s = '你好' for item in s: print(item)
输出结果为:
�
�
�
�
�
�
s = '春眠不觉晓,处处闻啼鸟,夜来风雨声,花落知多少' for item in s: print(item,end='')
输出结果为:
春眠不觉晓,处处闻啼鸟,夜来风雨声,花落知多少
通过上面两个例子可以看出,3是按照字符方式来输出的(英文特殊符号也是一样),2.7输出结果为乱码,按照字节方式输出(但如果是英文或者特殊字符的话,也是跟3一样),再比如:
print(len('你好'))
这一句代码,在3.5版本里输出结果为2,但是在2.7版本里输出结果为6(因为对于utf-8来说,一个汉字占3个字节)
我们用3,把唐诗转换成字节:
s = '春眠不觉晓,处处闻啼鸟,夜来风雨声,花落知多少' for item in s: byte_list = bytes(item,encoding='utf-8') print(item,end='') for byt in byte_list: print(byt,bin(byt),end='') print()
输出结果为:
春230 0b11100110152 0b10011000165 0b10100101
眠231 0b11100111156 0b10011100160 0b10100000
不228 0b11100100184 0b10111000141 0b10001101
觉232 0b11101000167 0b10100111137 0b10001001
晓230 0b11100110153 0b10011001147 0b10010011
,239 0b11101111188 0b10111100140 0b10001100
处229 0b11100101164 0b10100100132 0b10000100
处229 0b11100101164 0b10100100132 0b10000100
闻233 0b11101001151 0b10010111187 0b10111011
啼229 0b11100101149 0b10010101188 0b10111100
鸟233 0b11101001184 0b10111000159 0b10011111
,239 0b11101111188 0b10111100140 0b10001100
夜229 0b11100101164 0b10100100156 0b10011100
来230 0b11100110157 0b10011101165 0b10100101
风233 0b11101001163 0b10100011142 0b10001110
雨233 0b11101001155 0b10011011168 0b10101000
声229 0b11100101163 0b10100011176 0b10110000
,239 0b11101111188 0b10111100140 0b10001100
花232 0b11101000138 0b10001010177 0b10110001
落232 0b11101000144 0b10010000189 0b10111101
知231 0b11100111159 0b10011111165 0b10100101
多229 0b11100101164 0b10100100154 0b10011010
少229 0b11100101176 0b10110000145 0b10010001
注意:
for byt in byte_list: print(byt,bin(byt),end='')
在对字节列表byte_list进行for循环时,print(byt)输出的是每一个字节对应的十进制,同样,对于len()这个函数,3.5里面也是按照字符来计算,而2.7里面是按照字节来计算
字符串与字节的相互转换:需要用到str类,str可以接收两个参数str(字节类型,编码)
s = '周星星' b_utf8 = bytes(s,encoding='utf-8') b_gbk = bytes(s,encoding='gbk') print('周星星的utf-8编码:',b_utf8) print('周星星的gbk编码:',b_gbk) print(str(b_utf8,encoding='utf-8')) print(str(b_gbk,encoding='gbk'))
输出结果为:
周星星的utf-8编码: b'\xe5\x91\xa8\xe6\x98\x9f\xe6\x98\x9f'
周星星的gbk编码: b'\xd6\xdc\xd0\xc7\xd0\xc7'
周星星
周星星