【发布时间】: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