To pojawia się wysoko w Google, dlatego chciałbym dodać informacje kontekstowe na temat pierwotnego pytania (moje wyróżnienie):
Dlaczego fs.readFile () Node.js zwraca bufor zamiast łańcucha?
Ponieważ pliki nie zawsze są tekstem
Nawet jeśli was jako programista wiedzieć to: Węzeł nie ma pojęcia, co jest w pliku, który próbujesz przeczytać. Może to być plik tekstowy, ale równie dobrze może to być archiwum ZIP lub obraz JPG - Node nie wie.
Ponieważ czytanie plików tekstowych jest trudne
Nawet gdyby Node wiedział, że ma odczytać plik tekstowy, nadal nie miałby pojęcia, które kodowanie znaków jest używane (tj. W jaki sposób bajty w pliku mapowane są na znaki czytelne dla człowieka), ponieważ samo kodowanie znaków nie jest przechowywane w pliku .
Istnieją sposoby odgadnięcia kodowania znaków w plikach tekstowych z większą lub mniejszą pewnością (tak właśnie robią edytory tekstu podczas otwierania pliku), ale zwykle nie chcesz, aby Twój kod polegał na domysłach bez wyraźnej instrukcji.
Bufory na ratunek!
Ponieważ więc nie zna i nie może znać wszystkich tych szczegółów, Węzeł po prostu odczytuje bajt pliku bajt, nie zakładając niczego o jego zawartości.
I właśnie taki jest zwrócony bufor: nieopakowany pojemnik na surową zawartość binarną. To, jak należy interpretować tę treść, zależy od Ciebie jako programisty.
To jedyna odpowiedź, która faktycznie odpowiada na pytanie zawarte w tytule.
frzsombor
4
@frzsombor Biorąc pod uwagę, że istnieje akceptowana odpowiedź, zakładam, że OP był naprawdę zainteresowany otrzymywaniem łańcuchów zamiast buforów i po prostu nie mógł poprawnie sformułować pytania. Niemniej jednak inni ludzie mogą przyjechać tutaj z Google z myślą o „dlaczego”, stąd moja odpowiedź. :)
Niby stare, ale należy wiedzieć, że to rozwiązanie wprowadza dodatkowy narzut, ponieważ i tak buffer.toString()zakłada kodowanie utf-8. Byłoby to więc równoważne (choć wolniejszej) odpowiedzi @hvgotcodes.
Brandon,
14
dataZmienna zawiera Bufferobiekt. Konwertuj go na kodowanie ASCII przy użyciu następującej składni:
Asynchronizacja:
Synchronizacja:
źródło
Zwraca obiekt buforowy.
Jeśli chcesz w ciągu, możesz przekonwertować go za pomocą
data.toString()
:źródło
buffer.toString()
zakłada kodowanie utf-8. Byłoby to więc równoważne (choć wolniejszej) odpowiedzi @hvgotcodes.data
Zmienna zawieraBuffer
obiekt. Konwertuj go na kodowanie ASCII przy użyciu następującej składni:Asynchronicznie:
źródło