javascript 中的字符串编码

String encoding in javascript

我通过 mac 查找器创建了一个文件夹并将其命名为 février(法语键盘)。我 运行 一个 node.js 脚本到 return 这个文件夹中的所有文件夹和文件。要从我使用的查找器中获取 folders/files 的名称:

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', ...]

然后我检查 dropbox api,如果这个文件已经上传到我的 dropbox 文件夹。我使用完整路径来检查它:

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;
}

即使我这样做时,return文件不存在,但是文件夹和文件都存在,但文件夹名称具有不同的编码。

然后我检查了每个文件夹名称的编码(我的取景器上的那个,还有我的保管箱上的那个)。我使用了 detect-character-encoding,这就是我得到的:

finder: février { encoding: 'ascii' }
dropbox: février { encoding: 'windows-1252' }

如果您尝试通过编辑器 select 两个 février 单词,您会发现您无法 select 相同的出现作为第一个,因为他们不一样 février =/= février.

是否有任何简单的方法可以将我的本地 ASCII(?) 字符串转换为 windows-1252 编码字符串以便能够将它们与之进行比较?

正如评论中所建议的那样,解决方案更简单,问题可能更复杂。我只需要通过 readdirSync 函数

规范化路径 return
const files = fs.readdirSync(dir);

files.forEach((file) => {
  const path = `${dir}/${file.normalize('NFC')}`;
  ...
});