Node.js 数据流重定向中文乱码,怎么解决啊。

Node.js 数据流重定向中文乱码,怎么解决啊。

var child = require(‘child_process’).exec;
var fs = require(‘fs’);

var son = child(‘dir’, function(err,stdout,stderr){});

var w = fs.createWriteStream(‘e:\lab\pipe.txt’, {encoding:‘utf8’});

son.stdout.setEncoding(‘utf8’);

son.stdout.pipe(w);

打开pipe.txt, 中文都是乱码


6 回复

对于Node.js中的数据流重定向出现的中文乱码问题,通常是因为字符编码不匹配导致的。在上述代码中,exec命令的输出默认可能是GBK或其他本地编码,而你将其设置为UTF-8进行处理,这就会导致乱码。

要解决这个问题,我们需要确保从子进程获取的数据流与写入文件时使用的编码一致。如果不确定子进程输出的编码,可以尝试直接使用二进制模式或指定正确的编码。

以下是一个改进后的代码示例,展示如何正确处理中文乱码问题:

var child = require('child_process').exec;
var fs = require('fs');

// 使用正确的编码,如GBK,以适应Windows环境下的默认编码
var son = child('dir', { encoding: 'binary' }, function (err, stdout, stderr) {});

var w = fs.createWriteStream('e:\\lab\\pipe.txt', { encoding: 'binary' });

son.stdout.on('data', function (chunk) {
    // 将二进制数据转换为字符串,使用正确的编码
    var str = Buffer.from(chunk, 'binary').toString('gbk');
    w.write(str);
});

son.stderr.on('data', function (chunk) {
    var str = Buffer.from(chunk, 'binary').toString('gbk');
    w.write(str);
});

son.on('close', function (code) {
    console.log(`子进程退出,退出码 ${code}`);
});

解释:

  1. 设置子进程的编码:在调用exec时,我们设置了{ encoding: 'binary' },这样子进程的输出会被当作二进制数据处理。
  2. 创建写入流:我们同样将写入流的编码设置为binary,以保持一致性。
  3. 数据处理:当接收到数据时,我们使用Buffer.from(chunk, 'binary')将二进制数据转换为Buffer对象,然后使用toString('gbk')将其转换为字符串,并指定正确的编码(例如GBK)。
  4. 错误处理:类似地处理标准错误流。

通过这种方式,我们可以确保数据流的编码一致,从而避免中文乱码问题。


这一行要改 var son = child(‘dir’, function(err,stdout,stderr){}); 改成 var son = child(‘dir’, {encoding: ‘binary’}, function(err,stdout,stderr){});

谢谢你的帮助。

问题仍存在,,,还是乱码哦。

找编码格式…

var child = require(‘child_process’).exec; var fs = require(‘fs’); var son = child(‘dir’, {encoding: ‘utf-8’}, function (err, stdout, stderr) {

}); var w = fs.createWriteStream(’./nb.js’, {encoding: ‘utf-8’,flag: ‘w’}); son.stdout.setEncoding(‘utf-8’); son.stdout.pipe(w);

为了确保数据流重定向时正确处理中文字符编码问题,你需要保证整个数据流中的编码一致。在你的例子中,使用的是 utf8 编码,这通常是正确的选择,但还需要确保子进程输出的编码也设置为 utf8

以下是修改后的代码示例:

var child = require('child_process').exec;
var fs = require('fs');

// 创建子进程并指定编码为 'utf8'
var son = child('dir', { encoding: 'utf8' }, function(err, stdout, stderr) {
    if (err) {
        console.error(`执行出错: ${err}`);
        return;
    }
    console.log(`执行成功: ${stdout}`);
});

// 创建写入流并指定编码为 'utf8'
var w = fs.createWriteStream('e:\\lab\\pipe.txt', { encoding: 'utf8' });

// 将子进程的标准输出重定向到文件,并设置编码
son.stdout.pipe(w);

// 可选地,也可以直接将标准输出写入文件
son.stdout.on('data', (data) => {
    w.write(data);
});

解释:

  1. 创建子进程:在创建子进程时通过 { encoding: 'utf8' } 参数指定编码。
  2. 创建写入流:在创建文件写入流时同样指定编码为 utf8
  3. 数据流重定向:使用 .pipe() 方法将子进程的标准输出直接重定向到文件。
  4. 可选地直接写入:使用 .on('data') 监听数据并直接写入文件,这样可以更灵活地处理编码问题。

这样做可以确保整个数据流的编码一致,避免出现乱码问题。

回到顶部