Строковое кодирование в JavaScript - PullRequest
0 голосов
/ 30 сентября 2018

Я создал папку через 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 Dropbox, если этот файл уже загружен в мою папку 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;
}

Несмотря на то, что когда я делаю это, он возвращает, что файла нет, однако папка и файл есть, но папкаИмя имеет другую кодировку.

Затем я проверил кодировку каждого имени папки (то, что на моем искателе, и то, что на моем Dropbox).Я использовал обнаружение кодировки символов , и вот что я получил:

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

Если вы попытаетесь выбрать два слова février через редактор, вы увидите, что можете '• выберите то же вхождение , что и первое, потому что они не совпадают février = / = février.

Есть ли какой-нибудь простой способ преобразования моего локального ASCII (?) строка в windows-1252 кодированную строку, чтобы иметь возможность сравнить их с?

1 Ответ

0 голосов
/ 02 октября 2018

Как предлагается в комментариях, решение более простое, что проблема может быть сложной.Мне просто нужно было нормализовать возвращаемый путь функцией readdirSync

const files = fs.readdirSync(dir);

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