2015-04-28 332 views
2

我使用XMLHttpRequest閱讀PDF文檔 http://www.virtualmechanics.com/support/tutorials-spinner/Simple2.pdf的XMLHttpRequest返回錯誤編碼字符

%PDF-1.3 
%âãÏÓ 
[...] 

並打印其內容出去控制檯:

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4 && xhr.status === 200) { 
     console.log(xhr.responseText); 
     console.log('âãÏÓ'); 
    } 
}; 
xhr.open('GET', 'http://www.virtualmechanics.com/support/tutorials-spinner/Simple2.pdf', true); 
xhr.send(); 

但是,控制檯說

%PDF-1.3 
%���� 
[...] 
âãÏÓ 

(最後一行來自參考文獻console.log上面,以驗證控制檯可以實際顯示這些字符。) 顯然,字符在某些時候被錯誤編碼。發生了什麼問題以及如何解決這個問題?

+0

也許你的控制檯字體根本不具備'âãÏÓ字形'... – mkl

+0

@mkl是的,它有。我相應地編輯了這個問題。 –

+1

Arg,我沒有立即看到,你使用'XMLHttpRequest.responseText'。該屬性已經嘗試將響應解釋爲文本並且似乎失敗。 PDF文件不是文本文件,因此不應該這樣對待。你可能想嘗試使用'XMLHttpRequest.response'而不是cf. MDN [發送和接收二進制數據](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data)頁面。 – mkl

回答

2

XMLHttpRequest的默認響應類型是text,但這裏一個實際處理的二進制數據。 Eric Bidelman描述瞭如何使用它。

該問題的解決方案是讀取數據爲Blob,然後從團塊中提取數據,並將其插入hash.update(..., 'binary')

var xhr = new XMLHttpRequest(); 
xhr.open('GET', details.url, true); 
xhr.responseType = 'blob'; 
xhr.onload = function() { 
    if (this.status === 200) { 
    var a = new FileReader(); 
    a.readAsBinaryString(this.response); 
    a.onloadend = function() { 
     var hash = crypto.createHash('sha1'); 
     hash.update(a.result, 'binary'); 
     console.log(hash.digest('hex')); 
    }; 
    } 
}; 
xhr.send(null); 
2

文件的MIME類型可能不是UTF-8。嘗試重寫它的建議here和描述如下:

xhr.open('GET', 'http://www.virtualmechanics.com/support/tutorials-spinner/Simple2.pdf', true); 
xhr.overrideMimeType('text/xml; charset=iso-8859-1'); 
xhr.send();