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')}`;
...
});
我通过 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
函数
const files = fs.readdirSync(dir);
files.forEach((file) => {
const path = `${dir}/${file.normalize('NFC')}`;
...
});