-4

当使用库请求一些非 ASCII/UTF8 数据时,我们经常会得到一个充满废话的字符串。例子:

const got = require("got");
got("http://twemoji.maxcdn.com/16x16/1f525.png")
    .then(response => console.log(response.body))

这是输出:

�PNG

IHD��aaIDAT8�c`��L�fEb��?��8�-���@���5�!� ���|bQ\�$�� �ׁX�y�xT
���y@<                                                       �c�i��6$�K$
L÷���w��������_��Ϡ���d��?�j��2��� ��hX��cn������e"L����x�3�
             ��Y�f�N���
mt:����2e�f��N���~{'̀x�ȿ �;�m
                             �
    �PIEND�B`�            �vZ�]�dX<R�\�Y:������`�A�A��ӂƟ}�����#A�\�n����|�A� u83����,�{������@�@4��#��D�

奇怪的是,这与我们在下载图像和使用时看到的相同:

cat 1f525.png

那个字符串到底是什么,为什么它看起来像这样,以及我们如何将它转换为适当的 Buffer 对象?

4

3 回答 3

1

那是一个 PNG 图像,它不是文本数据,而只是基本的二进制数据。将其解释为字符串是没有意义的。

got将返回string, buffer,readableStreamobject. console.log正在将您的流转换为不是您想要的字符串。cat处理文本,而不是二进制数据。

此外,来自的响应http://twemoji.maxcdn.com/16x16/1f525.png不包括Content-Type可能会从got库中抛出的标头。

于 2017-02-28T17:59:00.507 回答
1

看到相同的输出并不奇怪cat——这就是 PNG 图像在解释为字符串时的样子。

根据got文档,当您将编码指定为null. 也许console.log正在将缓冲区转换为字符串,或者您可以尝试将编码设置为image/png.

您是否真的尝试将图像保存到文件?也许它会起作用。

于 2017-02-28T18:03:50.070 回答
1

默认情况下,got会为您获取一个字符串。它假定您默认需要 UTF-8 文本数据,因为这可能是最常见的情况,人们获取 HTML 文档。从文档中

encoding

类型:字符串,null

默认:'utf8'

setEncoding对响应数据使用的编码。如果null,则正文作为Buffer.

如果您想要二进制数据,请指定{encoding: null}

const got = require("got");
got("http://twemoji.maxcdn.com/16x16/1f525.png", {encoding:null})
    .then(response => console.log(response.body))

然后response.body将是一个Buffer.

于 2017-02-28T18:04:53.353 回答