鱼C论坛

 找回密码
 立即注册
查看: 2808|回复: 8

(转码问题)大神快来,要疯掉了,谁来帮我看看

[复制链接]
发表于 2015-2-1 11:41:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 水中映日” 于 2015-2-1 20:37 编辑

ee.png


无论怎么转都是一样的。 显示出来的都是BYTE类型啊
大神们帮帮忙哦
add = data.decode()
或者 :   add = data.decode('utf-8')
或者 :   add = str(data)
都是一样的结果哦, 打印出来的 都是BYTE 类型
这个是照某书上的客户端程序写的


然后这个是服务器程序

eeq.png



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-2-1 17:35:53 | 显示全部楼层
服务端的
  1. self.wfile.write(('[%s]%s'%(ctime(),self.data)).encode())
复制代码

改成
  1. self.wfile.write(('[%s]%s'%(ctime(),self.data.decode())).encode())
复制代码

或者你在之前加上一句
  1. self.data = self.data.decode()
复制代码

字符串的基本都是返回一个新的,而不改旧的。

出现这样的原因是

data本来也是个bytes类型你把他加在字符串里了。
所以字符串先变成了"b'\ue\sd'"(我乱打的- -。)
但是字符串不认识\ue\sd,所以把'\'转义成'\\'
就变成了"b'\\ue\\sd'"这样反斜杠失去了原来的作用。
所以再次编码时ue,sd就变成了普通的英文字母。解码编码对他就没有作用了。

所以打印出来就是"b'\ue\sd'"这里的'\'是没有反斜杠意义的反斜杠。( 好绕- -,不知道这样说可不可以,反正就是那个意思啦~。)

客户端
360截图20150201173416552.jpg

服务端
360截图20150201173427495.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-1 12:01:09 | 显示全部楼层
路过,可惜我不会python{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-1 12:38:26 | 显示全部楼层
@wei_Y
大召唤术!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-1 14:01:11 | 显示全部楼层
先encode在decode不行吗,我这里可以。 360截图20150201140024177.jpg


你能把代码贴一下吗,另外我这块也不太会。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-1 15:12:56 | 显示全部楼层
wei_Y 发表于 2015-2-1 14:01
先encode在decode不行吗,我这里可以。

socket.recv() 返回的就是一个BYTE 类型的数据呀,不能用encode()转码了,会报错
我在IDLE试了:
b = b'\xe4\xbd\xa0\xe5\xa5\xbd'           # '你好'
type(b)
显示b的的确是bytes类型。
然后 b= b.decode()
成功将b的值转码成了STR ,b的内容显示的是'你好', type(b) 显示的也是str 类型

可是在程序中运行输出就不行,不管怎么转一样是一个bytes 类型的值
不知道是不是电脑出了问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-1 15:18:14 | 显示全部楼层
wei_Y 发表于 2015-2-1 14:01
先encode在decode不行吗,我这里可以。

这个是客户端的代码。  我在虚拟机上运行的

from socket import *

HOST = 'IP地址'
PORT = 21567                                 #连接的端口号
BUFSIZ = 1024                                #要读取数据的缓冲区大小
ADDR = (HOST,PORT)                          

while True:
    tcpCliSock = socket(AF_INET,SOCK_STREAM)     
    tcpCliSock.connect(ADDR)
    data = input('输入要说的话:')
    if not data:
        break
    tcpCliSock.send(('%s\r\n'%data).encode())
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    add = data.decode()
   
    print(add)
    tcpCliSock.close()
   




=============================================================

这个是服务器的代码,我在主机运行的

from socketserver import (TCPServer as TCP,StreamRequestHandler as SRH)
from time import ctime

HOST = 'IP地址'
PORT = 21567
ADDR = (HOST,PORT)

class Handler(SRH):
    def handle(self):
        print ('...connected from:',self.client_address)
        self.data = self.rfile.readline().strip()
        if not self.data:
            pass
            
        else:
            
            print (self.data.decode())
            self.wfile.write(('[%s]%s'%(ctime(),self.data)).encode())
        

tcpServ = TCP(ADDR,Handler)
print('waiting for connection...')
tcpServ.serve_forever()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-1 20:36:26 | 显示全部楼层
wei_Y 发表于 2015-2-1 17:35
服务端的

改成

噢! 原来是服务器那的转码出了问题。
哎呀 斯够咿! 大爱斑竹!膜拜斑竹!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-2 14:27:57 | 显示全部楼层
发现我不会:sad
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-14 16:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表