Crossin的编程教室

标题: 创建客户端、服务器过程中格式问题 [打印本页]

作者: TED    时间: 2017-12-8 18:15
标题: 创建客户端、服务器过程中格式问题
本帖最后由 TED 于 2017-12-8 18:29 编辑

最近看到Python核心编程(第二版),第16章网络编程 16.3.6 创建一个UDP服务器,在跑给的源代码例子时,出了点关于bytes、str格式的问题,试着改格式也没成功,求指点:

12.8.2.PNG

在客户端接收的data这里,红线圈的这句我想把data 由bytes转str,但下面接收的data 再print出来,为什么还是b'形式?
12.8.01.jpg

附件里我加了py文件,并不是原书带的原码了,我乱改了些。。py3格式的



代码.rar

776 Bytes, 下载次数: 0

相关py文件


作者: kickccat    时间: 2017-12-8 19:24
你需要decode,而不是encode。
作者: TED    时间: 2017-12-8 21:13
kickccat 发表于 2017-12-8 19:24
你需要decode,而不是encode。

问题好像不是出在这
这里我用的时str 和 bytes的相互转换 str(bytes,encoding="utf-8")  和 bytes(str,encoding="utf-8")
等同于您提的这个 str.encode(s) 和 bytes.decode(b)

相关链接: https://www.cnblogs.com/solakevon/p/6010717.html

作者: TED    时间: 2017-12-8 21:38
问题解决了~
之前我试着把bytes转成str,确实是成功了,多加一句print(type(data))输出的确实是str,要注意,这里的str 指的是我用红线圈出来的一整部分,包含蓝线圈出来的两部分,第一个蓝圈框出来的[...]已经是正常的str类型了,右半部分的蓝圈里面还是bytes,所以要找回这部分的代码,把它的格式由bytes转回str.
12.8.3.jpg

因为最终data 前半部分是和time相关的,想快速找的话直接找关于time的函数就好了,如下图'[%s]%r' 整体为string,但其中%r 对应的是data 此时还是bytes,所以导致最终右半部分是bytes格式,所以只要再把这里改掉就好了
12.8.4.PNG

接下来就把此处的data格式由bytes转str就好了,为了证明此处的 str(bytes,encoding="utf-8")也能正常将bytes转str,我用decode 和这方法同时试了下 结果都能正常显示了~
12.8.6.PNG 12.8.5.PNG



作者: TED    时间: 2017-12-8 21:55
至于python2为什么不用涉及str和bytes相互转化,直接就能运行,在这,我把原书的源代码python2版本的代码贴在这,让同学帮忙跑了下,是直接可以显示汉字的 12.8.8.PNG 12.8.7.PNG

可能是python2时bytes没有意义,在python3中对bytes做了严格的区分?(看了下面两个链接做的小结论吧,之后确定了再来修改)
https://www.cnblogs.com/wuwen19940508/p/6760018.html
https://www.cnblogs.com/chownjy/p/6625299.html


作者: TED    时间: 2017-12-14 17:29
在看了python核心编程第三版P54关于2,3版本的差异已经附录中关于其编码的解释,个人理解现在是这样:
python2中默认脚本文件是ASCII编码,分str字符串和unicode字符串;而到了python3中,默认脚本文件是unicode编码,python2中的str字符串变成了 3中的bytes,unicode字符串成为了3中的str.(见python核心编程第三版P616)
所以说当用到python3时,bytes作为保存数据的类型,str作为保存文本的类型,在传输数据过程中是bytes,输入内容和获取了数据转化为显示的都是文本str,要实现其转化;而2里面,并没有对数据和文本进行区分,不用转换。





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5