我通过mac finder创建了一个文件夹,并将其命名为février
(法语键盘)。我运行一个node.js脚本以返回此文件夹中的所有文件夹和文件。要从我使用的查找器中获取文件夹/文件的名称:
const files = fs.readdirSync(dir);
files.forEach((file) => {
const path = `${dir}/${file}`;
const stat = fs.statSync(path);
if (stat && stat.isDirectory()) {
results = results.concat(readLocalDir(path));
} else {
results.push(path);
}
});
它给了我一个具有完整路径
['février/image.png', ...]
的数组。然后,我使用保管箱api检查该文件是否已经上传到我的保管箱文件夹中。我使用完整路径对此进行检查:
return dropbox
.filesListFolder({ path: `/${dir}`, recursive: true })
.then(res => getFilesListContinue(res))
...
async function getFilesListContinue(res) {
if (res.has_more) {
const files = await dropbox.filesListFolderContinue({ cursor: res.cursor });
return getFilesListContinue({
has_more: files.has_more,
entries: flatten([res.entries, files.entries]),
cursor: files.cursor,
});
}
return res;
}
即使执行此操作时,它也会返回文件不存在的信息,但是,文件夹和文件仍在其中,但是文件夹名称具有不同的编码。
然后,我检查了每个文件夹名称的编码(在我的查找器中,在我的保管箱中)。我使用了detect-character-encoding,这就是我得到的:
finder: février { encoding: 'ascii' }
dropbox: février { encoding: 'windows-1252' }
如果您尝试通过编辑器选择两个
février
单词,您将看到您无法选择与第一个相同的出现,因为它们不是相同的février
= / = février
。有什么简单的方法可以将我的本地ASCII(?)字符串转换为
windows-1252
编码的字符串,以便与它们进行比较? 最佳答案
如评论中所建议,解决方案更为简单,因为问题可能很复杂。我只需要通过readdirSync
函数标准化路径返回
const files = fs.readdirSync(dir);
files.forEach((file) => {
const path = `${dir}/${file.normalize('NFC')}`;
...
});