据我所知,我现在总是解码来自我的脚本(Python Web服务器)的用户输入。
我总是编码输出,例如当我从服务器向客户端发送数据时,在websocket连接中。
我应该这样做:
ws.send(json.dumps({'message' : message, 'id': i}))
或
ws.send(json.dumps({'message' : message, 'id': i}).encode('utf8'))
第一个在Python 2.7中似乎没问题,因为似乎json.dumps(...)
的结果已经编码:
print type(json.dumps({'message' : message, 'id': i}))
# <type 'str'>
.encode('utf8')
之后我们应该json.dumps()
吗?
答案 0 :(得分:1)
通常,通过套接字连接发送和接收的数据是客户端和服务器之间的握手。客户端应发送服务器可接受的数据,无论是utf-8
还是latin
都无关紧要。
简而言之,请执行您喜欢的任何编码,但请记住您的服务器期望相同。
关于你的问题:
在json.dumps()之后我们应该.encode('utf8')吗?
以下是一个例子:
>>> a = {'a': 'Hello'}
>>> str_a = json.dumps(a) # type(str_a) --> <class 'str'>
>>> bytes_a = json.dumps(a).encode('utf8') # type(bytes_a) --> <class 'bytes'>
让我们检查两者的内存大小:
>>> import sys
>>> sys.getsizeof(str_a)
63
>>> sys.getsizeof(bytes_a)
47
Cleary bytes字符串比普通字符串消耗更少的内存。发送编码数据以减少网络使用是更好的选择。对于通过套接字的数据传输,这是一个需要考虑的主要因素。