2013-05-19 49 views
1

我使用Q42.Winrt庫來下載html文件來緩存。 但是當我使用ReadTextAsync時,我有例外:從ANSII編碼的文件讀取文本

目標多字節代碼頁中不存在用於Unicode字符的映射。 (異常來自HRESULT:0x80070459)

我的代碼很簡單

var parsedPage = await WebDataCache.GetAsync(new Uri(String.Format("http://someUrl.here"))); 
var parsedStream = await FileIO.ReadTextAsync(parsedPage); 

我打開下載的文件並沒有ANSII編碼。我想我需要將其轉換爲UTF-8,但我不知道如何。

+0

這個錯誤似乎並不符合你的觀察,即它是ANSI(你是如何確定的?),但無論如何,[ReadTextAsync](http://msdn.microsoft.com/en-us/library/windows /apps/hh701706.aspx)有一個重載,允許您提供Unicode編碼以匹配源文件。也許這會讓你更進一步? –

+0

我在Notepad ++中打開下載的文件,並看到ANSI編碼。我嘗試重載ReadTextAsync並沒有幫助。 – TheX

+0

你有我們可以看的文件/網址嗎? –

回答

6

問題是原始頁面的編碼不是Unicode,它是Windows-1251,而ReadTextAsync函數只處理Unicode或UTF8。解決方法是將文件讀取爲二進制文件,然後使用Encoding.GetEncoding來解釋1251代碼頁中的字節並生成字符串(始終爲Unicode)。

例如,

 String parsedStream; 
     var parsedPage = await WebDataCache.GetAsync(new Uri(String.Format("http://bash.im"))); 

     var buffer = await FileIO.ReadBufferAsync(parsedPage); 
     using (var dr = DataReader.FromBuffer(buffer)) 
     { 
      var bytes1251 = new Byte[buffer.Length]; 
      dr.ReadBytes(bytes1251); 

      parsedStream = Encoding.GetEncoding("Windows-1251").GetString(bytes1251, 0, bytes1251.Length); 
     } 

的挑戰是你不知道從存儲的字節代碼頁是什麼,所以它在這裏工作,但可能不會對其他網站的工作。一般來說,UTF-8是你從網上獲得的,但並非總是如此。此頁面的Content-Type響應標題顯示代碼頁,但該信息未存儲在文件中。

+0

謝謝。你是對的! – TheX