Вопрос по node.js, ascii – Проверить, является ли файл двоичным или ASCII с Node.js?

19

Мне интересно, что будет лучшим способом проверить, является ли файл двоичным или ASCII с Node.js?

Похоже, есть два способа, не специфичных для node.js:

  1. Checking the MIME type: How to Check if File is ASCII or Binary in PHP - however this has it's problems, as for instance pre-precessors often don't have a recognised mime type and revert to application/octet-stream when checking them using mime

  2. Via checking the byte size using a stream buffer with How to identify the file content as ASCII or binary - which seems quite intensive, and does yet provide a node.js example.

Так уже есть другой путь? Возможно, секретный вызов node.js или модуль, о котором я не знаю? Или, если я должен сделать это сам, какой путь будет предложен?

Спасибо

Можете ли вы определить, что вы подразумеваете под "двоичным файлом"? То, как вы тестируете, зависит именно от того, что вы имеете в виду, и не существует универсально согласованного определения. David Schwartz
Вы можете, вероятно, рассмотреть байты ASCII, если старший бит очищен. Но это не удастся для таких вещей, как UTF-8 или Unicode, которые вы можете (или не можете) рассматривать текст. Вы действительно должны предоставить точное определение того, что & quot; текст & quot; и "бинарный" значит, или вам нужно документировать ваш вариант использования, чтобы мы могли найти правильные определения. David Schwartz
Это действительно недостаточно конкретно. Что вы планируете делать с информацией? (Будет ли достаточно проверить первые 8 КБ на наличие символов, не относящихся к ASCII?) David Schwartz
Конечно. Дело в том, что, кажется, есть несколько подходов, но я не уверен, как любой из них может быть перенесен на Node.js. Ваше предложение там кажется великолепным, поэтому я с радостью согласен с тем, что на примере кода можно получить информацию о том, как - поскольку документация не очень ясна о том, как вы выполняете такую проверку (являются ли эти байты ASCII или нет). balupton
Скажем, изображение или, точнее, все, что не является текстом. Извини за это! balupton

Ваш Ответ

3   ответа
10

Дэвид Шварц, Я создалistextorbinary Для решения этой проблемы.

Coffeescript мешает людям легко отправлять патчи. так что вам не нужно много поддерживать.
Подумайте об обновлении вашего вопроса, если вы действительно хотели идентифицировать текстовые файлы в целом, а не кодировку ASCII.
для чего это стоит, istextorbinary теперь является javascript balupton
Почему так кофе-крипт?
1

но так как я не смог найти удовлетворительного ответа, я выбрал другой подход, который мне подходит:

const string_to_test = "I am just a piece of text";
//const binary_to_test = "��˰!1�H��1�1����!H�=u�!�";
if(/\ufffd/.test(string_to_test) === true){
    console.log("I'm 'binary'");
}else{
    console.log("I'm proper text");
}

Как это работает? Если вы попытаетесь открыть двоичные данные обычным способом (без использования шестнадцатеричного редактора), он столкнется с некоторыми проблемами рендеринга, которые преобразуются вам как последовательность этого странного символа & # xFFFD; называется "Заменяющий символ".

Эта подстановка символов также может появиться, когда вы берете текст из некоторого места, используя utf-8 с определенными символами, и затем пытаетесь использовать его на своей странице, которая использует более старую кодовую страницу, в которой пропущены эти символы, так что это не обязательно указывает на то, что двоичный файл.
Это единственный способsome редакторы и браузеры отображают двоичный текст в виде текста. Сама строка js (если вы не извлекаете ее из текстовой области или любой другой текстовой операции, которая делает это), которая содержит двоичные данные, считанные из файла, будет иметь значения только от 0 до 255 и никогда не будет иметь ufffd. Firefox не конвертируется в одного и того же персонажа. Он использует специальный шрифт, чтобы показать значение кода символа.
как декодировать двоичный файл в изображение? У меня возникли проблемы с этим, ниже приведена ссылка на мой вопрос.stackoverflow.com/questions/54939990/…
4

ASCII определяет символы 0-127поэтому, если все содержимое файла является байтовыми значениями в этом диапазоне, то его можно рассматривать как файл ASCII.

  // Read the file with no encoding for raw buffer access.
  require('fs').readFile(filename, function(err, buf) {
    if (err) throw err;
    var isAscii = true;
    for (var i=0, len=buf.length; i<len; i++) {
      if (buf[i] > 127) { isAscii=false; break; }
    }
    callback(isAscii); // true iff all octets are in [0, 127].
  });
}
fileIsAscii('/usr/share/dict/words', function(x){/* x === true */});
fileIsAscii('/bin/ls', function(x){/* x === false */});

Если производительность критична, подумайте о написании пользовательской функции C ++ для каждого связанного ответа.

Похожие вопросы