Node.js net库Socket.write()是否转UTF-8及发送前内容检查方法
Node.js net.Socket.write() 编码与内容检查
1. Socket.write() 对字符串的编码处理
当调用 socket.write() 传入字符串时,默认会将字符串转换为 UTF-8 编码的 Buffer 再发送。如果需要指定其他编码,可以在 write() 的第二个参数传入编码类型(比如 'ascii'、'base64' 等),此时会用指定编码转换字符串。
示例代码:
// 默认用 UTF-8 编码发送 socket.write('Hello 世界'); // 指定用 ASCII 编码(非 ASCII 字符会被替换为 ?) socket.write('Hello 世界', 'ascii');
2. 检查发送前的写入内容
方法一:手动预转换编码查看
在调用 write() 前,手动将字符串按对应编码转为 Buffer,直接查看 Buffer 的内容:
const str = 'Hello 世界'; // 用默认 UTF-8 编码转换 const buf = Buffer.from(str, 'utf8'); console.log('发送前的 Buffer 内容:', buf); console.log('十六进制字节:', buf.toString('hex')); // 查看原始字节 console.log('转回字符串:', buf.toString('utf8')); // 如果指定了编码,用对应编码转换 const asciiBuf = Buffer.from(str, 'ascii'); console.log('ASCII 编码的 Buffer:', asciiBuf);
方法二:重写 write 方法拦截记录
通过重写 Socket 的 write 方法,在实际发送前自动记录要发送的内容:
const net = require('net'); const socket = net.createConnection({ port: 8080 }, () => { // 保存原始 write 方法 const originalWrite = socket.write; // 重写 write 方法 socket.write = function(data, encoding, callback) { // 处理字符串类型的 data if (typeof data === 'string') { const usedEncoding = encoding || this.encoding || 'utf8'; const encodedData = Buffer.from(data, usedEncoding); console.log(`发送前(${usedEncoding} 编码):`); console.log('Buffer 内容:', encodedData); console.log('十六进制:', encodedData.toString('hex')); } // 处理 Buffer 类型的 data else if (Buffer.isBuffer(data)) { console.log('发送前的 Buffer 内容:', data); console.log('十六进制:', data.toString('hex')); } // 调用原始 write 方法完成发送 return originalWrite.call(this, data, encoding, callback); }; // 测试发送 socket.write('Hello 世界'); });
内容的提问来源于stack exchange,提问作者Suneet Bansal
相关产品推荐
相关产品推荐

