在使用 Socket.io 进行前端实时通信时,一些开发者可能会遇到发送中文字符时无法发送成功的问题。本文将详细介绍 Socket.io 不能发送中文的原因,并提供解决方案和示例代码。
问题
在使用 Socket.io 进行前端实时通信时,发送中文字符的代码如下:
socket.emit('message', '你好')
但是,如果监听后端的信息接收事件,代码如下:
socket.on('message', function(msg) { console.log(msg) })
此时, msg
输出内容却是 undefined
。
原因
Socket.io 默认使用 UTF-8 编码进行通信。但是,在 JavaScript 中,字符串采用 UTF-16 编码。当我们向后端发送中文字符串时,Socket.io 会将其转换为 UTF-8 编码,而后端接收时,会将其解码为 UTF-16 编码,导致中文字符乱码。
解决方案
解决这个问题,需对传输数据类型进行设置。
方案一:使用 Blob 对象传输
Blob(Binary Large Object)是一个二进制对象,可以用来保存和传输大量的二进制数据。在 Socket.io 中,可以使用 Blob 对象传输中文数据,示例如下:
发送端:
let str = '你好' let blob = new Blob([str], { type: 'text/plain' }) socket.emit('message', blob)
接收端:
socket.on('message', function(blob) { let reader = new FileReader() reader.readAsText(blob, 'utf-8') reader.onload = () => { console.log(reader.result) } })
方案二:使用 Buffer 对象传输
在 Node.js 中,可以使用 Buffer 对象来处理二进制数据。若使用 Buffer 对象传输中文数据,可通过将数据转为二进制数据 Buffer,再转换回来来解决中文字符乱码问题。
发送端:
let str = '你好' let buffer = Buffer.from(str) socket.emit('message', buffer)
接收端:
socket.on('message', function(buffer) { let msg = buffer.toString('utf-8') console.log(msg) })
总结
通过以上的两种方式,我们可以有效地解决 Socket.io 不能发送中文的问题。在日常的开发中,选择合适的方法将会极大地提高开发效率和稳定性。
参考文献:
下面给出一个完整的使用 Socket.io 发送中文字符的示例。
-- -------------------- ---- ------- -- --- --- --- - ---- --- ---- - --- ----------- - ----- ------------ -- ---------------------- ----- -- --- -------------------- -------------- - --- ------ - --- ------------ ----------------------- -------- ------------- - -- -- - -------------------------- - --
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6652fdadd3423812e4782de6