Nodejs readdir到的中文文件名乱码

Nodejs readdir到的中文文件名乱码

js var fs = require(‘fs’);
var dir = fs.readdirSync(’./’);
console.log(‘这里是能显示中文的’);
for (var i in dir)
console.log(dir[i]);//这里遇到中文文件名 就出乱码了

windows下正常 vps上就有这个问题 请问怎么解决

Ubuntu 12.04.2

7 回复

标题:Nodejs readdir到的中文文件名乱码

内容:

var fs = require('fs');

// 使用Promise封装异步操作,方便处理错误和结果
function readDir(dirPath) {
    return new Promise((resolve, reject) => {
        fs.readdir(dirPath, 'utf8', (err, files) => {
            if (err) {
                reject(err);
            } else {
                resolve(files);
            }
        });
    });
}

readDir('./')
    .then(files => {
        console.log('这里是能显示中文的');
        for (let file of files) {
            console.log(file); // 这里可以正确显示中文文件名
        }
    })
    .catch(err => {
        console.error('读取目录时发生错误:', err);
    });

问题描述: 在使用Node.js的fs.readdir方法读取包含中文文件名的目录时,在某些环境下(如VPS),可能会出现中文文件名乱码的情况。但在Windows环境下则没有问题。

解决方案:

  1. 确保在调用fs.readdir时指定正确的字符编码。通常情况下,使用’utf8’作为编码参数可以解决大部分乱码问题。
  2. 如果上述方法仍然无法解决问题,可能是因为系统或文件系统的默认字符编码设置不正确。检查并修改系统的区域设置和字符编码设置。

在这个示例中,我们通过将fs.readdir方法的回调函数封装在一个Promise中,使其更容易处理异步操作。同时,我们在调用fs.readdir时指定了字符编码为’utf8’,以确保能够正确读取包含中文字符的文件名。

如果以上方法仍然不能解决问题,建议检查你的VPS环境中的区域设置和字符编码设置是否正确。


这个和你的程序无关,你的这个文件保存的编码方式要改下,改成utf8的,

如果你用的是Sublime, 文件->保存编码方式为->utf8就行了

首先 程序.js 是utf-8的 然后 中文的文件名 文件夹名 都是乱码

已经放弃了 用英文了 感谢回复

Ubuntu系统,默认的编码是Utf8的,而JS里,文字的编码是Unicode的 所以觉得可能是因为这两者编码不一致造成的,可以转一下码看看。

同时代码里代码中文。

遇到了同样的问题. Windows 文件夹或文件名是 GBK 编码, Linux 是UTF8, fs.readdirSync encoding 不支持 GBK. 在Linux 服务器转换文件名称编码: convmv -f gbk -t utf-8 -r --notest /home/xxx -f from -t to -r 递归 –notest actually do rename the files

对于Node.js中的文件名乱码问题,通常是因为文件系统的编码与当前环境的编码不一致导致的。在Windows系统中,默认使用GBK或GB2312编码,而在Linux系统中则通常使用UTF-8编码。当Node.js读取文件名时,如果编码不匹配,就会出现乱码现象。

你可以尝试将文件名转换为正确的字符集,以解决乱码问题。下面是一个使用iconv-lite库来转换编码的例子:

示例代码

首先安装iconv-lite库:

npm install iconv-lite --save

然后修改你的代码:

const fs = require('fs');
const iconv = require('iconv-lite');

// 获取文件列表
let files = fs.readdirSync('./');

console.log('这里是能显示中文的');
files.forEach(file => {
    // 将文件名从gbk转为utf8
    let decodedName = iconv.decode(Buffer.from(file, 'binary'), 'gbk');
    console.log(decodedName);
});

解释

  1. 引入iconv-lite:这个库可以用来处理不同编码之间的转换。
  2. fs.readdirSync读取目录:获取指定路径下的所有文件名。
  3. iconv.decode进行编码转换:将从文件系统中读取到的文件名从GBK编码转换成UTF-8编码,以便正确显示。

确保你服务器上的文件系统实际使用的编码是GBK(或者GB2312),这样上面的代码就能正常工作。如果你发现文件名在服务器上本来就是用UTF-8编码存储的,那么不需要进行编码转换。

注意事项

  • 确保在服务器上安装了正确的编码包(如iconv)。
  • 如果你在不同的环境中运行此代码,请检查并设置正确的文件系统编码。
回到顶部