【问题标题】:String encoding in javascriptjavascript中的字符串编码
【发布时间】:2018-09-30 10:46:37
【问题描述】:

我通过 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;
}

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

然后我检查了每个文件夹名称的编码(我的 finder 上的一个,以及我的 Dropbox 上的一个)。我使用了detect-character-encoding,这就是我得到的:

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

如果您尝试通过编辑器选择两个février 单词,您会看到您无法选择与第一个出现相同的,因为它们不是相同的février =/= février.

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

【问题讨论】:

  • "février" 不能用 ASCII 表示。你是如何检查编码的?
  • 请注意,真正的 ASCII 没有任何带重音的字母
  • 一般来说,您根本无法进行可靠的自动编码检测。您应该解释您面临的实际问题(如果您一直收到février,那么您描述它的方式似乎没有任何问题)。
  • 把你想要比较的所有字符串通过相同的 Unicode 规范化。不确定具体的 node.js API 是什么,但是用谷歌搜索这个关键字应该会有所收获。
  • 编码和规范化是两个不同的东西。

标签: javascript node.js encoding dropbox-api


【解决方案1】:

正如 cmets 中提出的,解决方案更简单,问题可能很复杂。我只需要通过readdirSync 函数来规范化路径返回

const files = fs.readdirSync(dir);

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

【讨论】:

  • 在尝试替换变音符号时遇到问题,但 JavaScript 找不到它们。使用normalize() 解决了这个编码问题。
猜你喜欢
  • 1970-01-01
  • 2013-06-15
  • 2016-07-15
  • 2021-09-22
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
相关资源
最近更新 更多