как работать со специальными символами в функции nodejs fs readdir

Я читаю каталог в nodejs, используя функцию fs.readdir(). Вы передаете ему строку, содержащую путь, и он возвращает массив, содержащий все файлы внутри этого пути к каталогу в строковом формате. У меня не работает со специальными символами (например, ï).

Я столкнулся с похожей проблемой, однако я работаю в OS X ).

Сначала я создал новый каталог с именем encoding и создал файл с именем maïs.md (в моем редакторе Sublime Text).

fs.readdir('encoding', function(err, files) {
  console.log(files);                                   // [ 'maïs.md' ]
  console.log(files[0]);                                // maïs.md
  console.log(files[0] === 'maïs.md');                  // false
  console.log(files[0] == 'maïs.md');                   // false
  console.log(files[0].toString('utf8') === 'maïs.md'); // false
});

Приведенный выше тест корректно работает для файлов без специальных символов. Как я могу правильно сравнить это?


person askmike    schedule 24.02.2013    source источник


Ответы (2)


Ваш персонаж кажется этим. Вы должны попробовать с

(1) console.log(files[0] == 'ma\u00EF;s.md'); 
(2) console.log(files[0] == 'mai\u0308;s.md'); 

Если (1) работает, это может означать, что файл, содержащий ваш код, не сохранен в формате utf-8, поэтому движок node.js неправильно интерпретирует символ ï в вашем коде.

Если (2) работает, это может означать, что файловая система передает механизму узла символ ï в его декомпозированной форме юникода (за i следует диакритический знак ¨). см. ответ @thejh

В этом (2) случае используйте библиотеку unorm, доступную в npm, для нормализации строк перед их сравнением (или оригинальный UnicodeNormalizer)

person Jerome WAGNER    schedule 24.02.2013
comment
к сожалению, это тоже не работает (ложные журналы), Sublime Text настроен на использование UTF8 для новых файлов, но я думал, что это касается только содержимого, а не имени файла? - person askmike; 25.02.2013
comment
можете ли вы вывести значение encodeURIComponent(files[0]) и encodeURIComponent('maïs.md') ; это может дать подсказку относительно того, указал ли @thejh вам правильное направление (составленные символы юникода) - person Jerome WAGNER; 25.02.2013
comment
просто используя console.log, я получаю mai%CC%88s.md для файлов [0], ma%C3%AFs.md для файла, скопированного из буквального. Кажется, что мы куда-то попали! - person askmike; 25.02.2013
comment
ok %CC%88 — это представление utf8 комбинированного диэрезиса ¨ (̈). Итак, похоже, ваша проблема действительно связана с нормализацией юникода, как намекнул @thejh. - person Jerome WAGNER; 25.02.2013
comment
библиотека unorm для узла действительно решает мою проблему! Большое спасибо, что указали мне на это! unorm.nfc(files[0]) === 'maïs.md' // true - person askmike; 25.02.2013

https://apple.stackexchange.com/a/10484/23863 выглядит уместно — вероятно, потому, что существуют разные способы выразить ï в utf8.

person thejh    schedule 24.02.2013
comment
это выглядит действительно сложно. Чего я хочу добиться: сопоставить имена файлов из каталога с теми, которые хранятся в другом месте. Я думаю, мне нужно выяснить, как изменить различные составные состояния. - person askmike; 25.02.2013