握手成功后前端向服务器发送报文信息,信息内容有中文。解析过程中如何解决乱码问题?
msg = decode1(self.conn.recv(1024)) #接收报文
#解析报文
def decode(data):
if not len(data):
return False
length = data[1] & 127
if length == 126:
mask = data[4:8]
raw = data[8:]
elif length == 127:
mask = data[10:14]
raw = data[14:]
else:
mask = data[2:6]
raw = data[6:]
ret = ''
for cnt, d in enumerate(raw):
ret += chr(d ^ mask[cnt % 4])
return ret
把中文发送的时候统一用utf8编码。然后解码的时候解码回来。
解决了吗 浏览器websocket 发来的 带中文的解析乱码 英文正常
def parse_recv_data(msg):
en_bytes = b''
cn_bytes = []
if len(msg) < 6:
return ''
v = msg[1] & 0x7f
if v == 0x7e:
p = 4
elif v == 0x7f:
p = 10
else:
p = 2
mask = msg[p:p + 4]
data = msg[p + 4:]
for k, v in enumerate(data):
nv = chr(v ^ mask[k % 4])
nv_bytes = nv.encode()
nv_len = len(nv_bytes)
if nv_len == 1:
en_bytes += nv_bytes
else:
en_bytes += b'%s'
cn_bytes.append(ord(nv_bytes.decode()))
if len(cn_bytes) > 2:
# 字节数组转汉字
cn_str = ''
clen = len(cn_bytes)
count = int(clen / 3)
for x in range(0, count):
i = x * 3
b = bytes([cn_bytes[i], cn_bytes[i + 1], cn_bytes[i + 2]])
cn_str += b.decode()
new = en_bytes.replace(b'%s%s%s', b'%s')
new = new.decode()
res = (new % tuple(list(cn_str)))
else:
res = en_bytes.decode()
return res
def parse_recv_data(msg):
en_bytes = b''
cn_bytes = []
if len(msg) < 6:
return ''
v = msg[1] & 0x7f
if v == 0x7e:
p = 4
elif v == 0x7f:
p = 10
else:
p = 2
mask = msg[p:p + 4]
data = msg[p + 4:]
for k, v in enumerate(data):
nv = chr(v ^ mask[k % 4])
nv_bytes = nv.encode()
nv_len = len(nv_bytes)
if nv_len == 1:
en_bytes += nv_bytes
else:
en_bytes += b'%s'
cn_bytes.append(ord(nv_bytes.decode()))
if len(cn_bytes) > 2:
# 字节数组转汉字
cn_str = ''
clen = len(cn_bytes)
count = int(clen / 3)
for x in range(0, count):
i = x * 3
b = bytes([cn_bytes[i], cn_bytes[i + 1], cn_bytes[i + 2]])
cn_str += b.decode()
new = en_bytes.replace(b'%s%s%s', b'%s')
new = new.decode()
res = (new % tuple(list(cn_str)))
else:
res = en_bytes.decode()
return res