2017-02-28 11 views
-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 
���[email protected]<              �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對象?

+1

你沒有得到緩衝區可能是'got'庫或服務器的問題。如果服務器告訴獲得的庫內容是「text/*」,那麼它可能會自動將其轉換爲字符串。 –

+0

@downvoters,謹慎解釋? – MaiaVictor

+0

將你的文件上傳到https://hexed.it,以獲得更好的輸出結果:) – Sampson

回答

1

這是一個PNG圖像,它不是文本數據,只是基本的二進制數據。把它解釋爲一個字符串是沒有意義的。

got將返回string,buffer,readableStreamobjectconsole.log正在將您的流轉換爲不是您想要的字符串。 cat涉及文本,而不是二進制數據。

此外,http://twemoji.maxcdn.com/16x16/1f525.png的響應不包括Content-Type標題,該標題可能會丟失got庫。

+0

...我知道它是二進制數據。這一點正是我爲什麼收到一個字符串而不是一個緩衝區,爲什麼這個字符串看起來像打印時的垃圾,而且大多數情況下我如何獲得一個可以保存到磁盤的正確緩衝區。 – MaiaVictor

1

cat看到相同的輸出並不奇怪 - 這就是PNG圖像在解釋爲字符串時的樣子。

根據got文檔,當您將編碼指定爲null時,它應該返回一個緩衝區。也許console.log將緩衝區轉換爲字符串,或者您可以嘗試將編碼設置爲image/png

您是否真的嘗試將圖像保存到文件?也許它會工作。

+0

'根據獲得的文檔,當你沒有指定編碼時它應該返回一個緩衝區。 「你是從哪裏讀到的?似乎默認行爲實際上是將其解釋爲「utf-8」,這是造成混淆的根源。實際上,保存不起作用,因爲它實際上已轉換爲UTF-8字符串。 @RyanPlant在這種情況下提出了正確的解決方案。無論如何謝謝! – MaiaVictor

+0

事實上,我的錯誤,文檔默認說它是'utf-8'。更正了我的答案。 – ralh

1

默認情況下,got會爲您提供一個字符串。它假設你默認使用UTF-8文本數據,因爲這可能是最常見的情況,即獲取HTML文檔的人。從the documentation

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

+1

這是正確的答案。 'got'默認爲'utf-8',那是我的混亂。一旦Stack Overflow允許我會接受這個。這個問題解決了傢伙,請停止回答!謝謝<3 – MaiaVictor

+0

@MaiaVictor我猜如果響應實際上包括類型,它不會那樣做。 –

+0

@ DanielA.White你的意思是「內容類型」標題,對吧?我想知道是否有一個在線工具或某些東西可以讓我檢查請求的迴應。 – MaiaVictor

相關問題