Можно ли загрузить ANSI-кодированную строку, используя nodejs - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть большое количество html файлов (около 2 КБ).
Эти html-файлы являются результатом преобразования из текстовых документов.
Файлы имеют некоторый текст на иврите внутри тегов html. Я прекрасно вижу текст, используя редакторы vscode или notepad ++.

Моя цель - l oop через папку и вставить содержимое файлов в некоторую БД. Так как я немного знаю nodejs - я решил построить "зацикливание", используя узел. Вот где я закончил:

fs.readdir('./myFolder', function (err, files) {
    total = files.length;

    let fileArr = []
    for(var x=0, l = files.length; x<l; x++) {
      const content = fs.readFileSync(`./myFolder/${files[x]}`, 'utf8');    

      let title = content.match(/<title>(.*?)<\/title>/g).pop()

      fileArr.push({id:files[x] , title})
    }
});

Проблема заключается в том, что хотя текст корректно отображается в редакторах при отладке, я вижу, что переменная "title" получает строки, состоящие из вопросительных знаков enter image description here

Полагаю, проблема в кодировке файла, я здесь?
Если так - есть ли способ декодировать строку?

PS Моя ОС windows10

Спасибо

1 Ответ

0 голосов
/ 25 февраля 2020

Здесь есть несколько возможностей, возможно, ваши входные файлы находятся в многобайтовой кодировке (например, utf8 utf16 et c), и ваш отладчик просто не показывает правильные символы из-за ограничений шрифта.

Я бы попробовал записать переменную заголовка в какой-нибудь тестовый файл, например так:

fs.writeFileSync(`title-test-${x}.txt`, title, "utf8");

и посмотреть, выглядит ли заголовок правильно в вашем текстовом редакторе.

Это также может возможно, что файлы закодированы в расширенной кодировке ascii , такой как Windows 1255 или ISO 8859-8. В этом случае fs.readFileSyn c не будет работать правильно, поскольку он не поддерживает эти кодировки (см. node.js список кодировок )

Если файлы кодируются с использованием Однобайтовое расширенное кодирование ascii, должно быть возможно преобразовать в более переносимое кодирование (такое как utf8).

Я бы порекомендовал для этой цели модуль iconv-lite , с ним можно многое сделать!

Например, для преобразования из Windows 1255 файл в utf8 вы можете попробовать:

    const iconv = require("iconv-lite");
    const fs = require("fs");

    // Convert from an encoded buffer to JavaScript string.
    const fileData = iconv.decode(fs.readFileSync("./hebrew-win1255.txt"),  "win1255");

    // Convert from JavaScript string to a buffer.
    const outputBuffer = iconv.encode(fileData, "utf8");

    // Write output file..
    fs.writeFileSync("./hebrew-utf8-output.txt", outputBuffer);
...