我通过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')}`;
  ...
});

07-24 09:25