Nodejs中文显示乱码处理

Nodejs中文显示乱码处理

exec(‘dir’,{ encoding: ‘utf8’, timeout: 100000, maxBuffer: 200*1024, killSignal: ‘SIGTERM’, cwd: null, env: null }, function(error,stdout,stderr){ response.writeHead(200, {‘Content-Type’: ‘text/plain;charset:utf-8’}); console.log(stdout); response.write(stdout); response.end(); });

输出的内容是乱码如何解决?

6 回复

在使用 Node.js 处理中文字符时,经常会遇到乱码问题。这通常是由于字符编码设置不正确导致的。在您的例子中,exec 函数用于执行系统命令,并且您希望将结果正确地展示出来。为了确保中文字符不会出现乱码,我们需要正确设置字符编码。

解决方案

  1. 确保 execencoding 参数设置为 'utf8': 在调用 exec 函数时,encoding 参数应该被设置为 'utf8',以确保输出内容是 UTF-8 编码的。

  2. 设置 HTTP 响应头中的字符集: 确保响应头中的字符集设置为 charset=utf-8,这样浏览器可以正确解析返回的内容。

  3. 确保文件本身的编码也是 UTF-8: 确保你的 JavaScript 文件也是 UTF-8 编码的,这样 Node.js 可以正确读取和处理其中的字符串。

示例代码

const { exec } = require('child_process');
const http = require('http');

http.createServer((request, response) => {
    exec('dir', { 
        encoding: 'utf8',
        timeout: 100000,
        maxBuffer: 200 * 1024,
        killSignal: 'SIGTERM',
        cwd: null,
        env: null
    }, (error, stdout, stderr) => {
        if (error) {
            console.error(`执行出错: ${error}`);
            return;
        }
        
        // 设置响应头的字符集
        response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
        console.log(stdout);
        response.write(stdout);
        response.end();
    });
}).listen(3000);

console.log('服务器运行在 http://localhost:3000/');

解释

  1. exec 函数

    • exec 是一个用于执行子进程的函数,这里用来执行 dir 命令。
    • encoding: 'utf8' 确保输出内容是 UTF-8 编码的。
  2. HTTP 响应头

    • response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}) 设置了响应头,明确告诉浏览器内容是 UTF-8 编码的文本。

通过以上步骤,我们可以确保在 Node.js 中处理中文字符时不会出现乱码问题。


确保js文件是utf-8

var exec = require(‘child_process’).exec; var iconv = require(‘iconv-lite’);

exec(‘dir’,{ encoding: ‘binary’, timeout: 100000, maxBuffer: 200*1024, killSignal: ‘SIGTERM’, cwd: null, env: null }, function(error,stdout,stderr){ var str = iconv.decode(stdout, ‘GBK’); console.log(str); });

中文乱码问题也可以参考这里 http://www.9958.pw/post/nodejs_gbk

response.writeHead(200, {‘Content-Type’: ‘text/plain;charset=utf-8’});
把:改成=

在 Node.js 中处理中文乱码问题,通常需要确保编码的一致性。在你的例子中,exec 函数的输出默认可能是使用系统本地编码(如 GBK 或其他),而你在响应头中设置了 utf8 编码。为了解决乱码问题,你需要确保从执行命令到最终输出的过程中使用相同的字符编码。

以下是一个示例,展示如何将命令输出正确转换为 UTF-8 编码,并在 HTTP 响应中正确显示:

const { exec } = require('child_process');
const http = require('http');

http.createServer((request, response) => {
  exec('dir', { 
    encoding: 'binary' // 使用二进制模式读取输出
  }, (error, stdout, stderr) => {
    if (error) {
      console.error(`执行出错: ${error}`);
      return;
    }
    
    // 将二进制字符串转换为 UTF-8 编码的字符串
    let result = '';
    for (let i = 0; i < stdout.length; i++) {
      result += String.fromCharCode(stdout.charCodeAt(i));
    }

    response.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'});
    response.write(result);
    response.end();
  });
}).listen(8080);

console.log('Server running at http://127.0.0.1:8080/');

在这个例子中,我们通过设置 encoding: 'binary' 来以二进制模式获取命令输出。然后遍历输出的每个字符并转换成对应的 UTF-8 字符。这能确保输出不会出现乱码。

注意,这里使用了 String.fromCharCode()stdout.charCodeAt(i) 进行字符转换,这是基于假设输出已经是某种字符编码形式(例如GBK或GB2312)。如果输出是二进制数据,那么更合适的处理方式是使用 iconv-lite 库进行编码转换,如下所示:

首先安装 iconv-lite

npm install iconv-lite

然后修改代码如下:

const { exec } = require('child_process');
const http = require('http');
const iconv = require('iconv-lite');

http.createServer((request, response) => {
  exec('dir', { 
    encoding: 'binary' // 使用二进制模式读取输出
  }, (error, stdout, stderr) => {
    if (error) {
      console.error(`执行出错: ${error}`);
      return;
    }
    
    // 使用 iconv-lite 转换输出编码为 utf8
    const decodedStdout = iconv.decode(Buffer.from(stdout, 'binary'), 'GBK'); // 假设输出是GBK编码

    response.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'});
    response.write(decodedStdout);
    response.end();
  });
}).listen(8080);

console.log('Server running at http://127.0.0.1:8080/');

在这个版本中,我们使用 iconv-lite 库将命令输出从GBK编码转换为UTF-8编码,从而避免乱码。

回到顶部