Это высоко ценится в Google, поэтому я хотел бы добавить некоторую контекстную информацию об исходном вопросе (выделение мое):
Почему Node.js 'fs.readFile () возвращает буфер вместо строки?
Потому что файлы не всегда текстовые
Даже если вы, как программист, знаете это: Node не знает, что находится в файле, который вы пытаетесь прочитать. Это может быть текстовый файл, но это также может быть ZIP-архив или изображение в формате JPG - Node не знает.
Потому что читать текстовые файлы сложно
Даже если бы Node знал, что нужно читать текстовый файл, он все равно не знал бы, кодировка символов используется (т. Е. Как байты в файле отображаются на читаемые человеком символы), поскольку сама кодировка символов не сохраняется в файле. ,
Есть способы угадать кодировку символов текстовых файлов с большей или меньшей достоверностью (это то, что текстовые редакторы делают при открытии файла), но вы обычно не хотите, чтобы ваш код полагался на догадки без вашего явного указания.
Буферы на помощь!
Итак, поскольку он не знает и не может знать все эти детали, Node просто читает байт файла за байтом, не предполагая ничего о его содержимом.
И это то, что является возвращаемым буфером: нерафинированный контейнер для необработанного двоичного содержимого. Как этот контент следует интерпретировать, решать вам как разработчику.
Это единственный ответ, который фактически отвечает на вопрос в заголовке.
frzsombor
4
@frzsombor Учитывая , что есть общепринятый ответ, я бы предположить , ОП действительно была заинтересован в получении строк вместо буферов и просто не мог фразы правильного вопроса. Тем не менее, другие люди могут прийти сюда из Google с фактическим «почему», поэтому мой ответ. :)
В некотором роде, но следует знать, что это решение вносит дополнительные издержки, поскольку в buffer.toString()любом случае предполагает кодирование utf-8. Таким образом, это будет равнозначно (хотя и медленнее) ответа @hvgotcodes.
Брэндон
14
dataПеременный содержит Bufferобъект. Преобразуйте его в кодировку ASCII, используя следующий синтаксис:
асинхронный:
Синхронизация:
источник
Он возвращает объект Buffer.
Если вы хотите, чтобы это было в строке, вы можете преобразовать его с помощью
data.toString()
:источник
buffer.toString()
любом случае предполагает кодирование utf-8. Таким образом, это будет равнозначно (хотя и медленнее) ответа @hvgotcodes.data
Переменный содержитBuffer
объект. Преобразуйте его в кодировку ASCII, используя следующий синтаксис:Асинхронный:
источник