2012-10-17 37 views
4

如果我使用FileIO.ReadTextAsync,ReadLinesAsync或DataReader讀取文本文件,則只能指定編碼的UnicodeEncoding枚舉的成員。這包括由於某種原因只有Utf8,Utf16BE和Utf16LE。我怎樣才能讀取一個文本文件與另一種編碼(如Windows-1252甚至常規的Unicode(所有字符2字節))然後?如何在WinRT中讀取除UFT8或UTF16以外的其他編碼的文本文件?

如果Windows商店應用程序與桌面應用程序共享文本文件或從互聯網上讀取文本文件,這可能很重要。

+0

這不是「某種原因」,這是一個很難停下來閱讀文本文件上房lossage錯誤的編碼。 Utf-16是「普通Unicode」並使用2個字節。您可以通過讀取二進制數據並使用Encoding類轉換文本來自己旋轉。 –

+0

謝謝漢斯。我不知道Encoding.Unicode實際上是UTF-16 LE(實際上使用2或4個字節)。我假設了「硬停」的相同原因,但我想確切知道。它確實有道理。使用BOM讀取UTF-8或UTF-16文件始終會成功,即使我傳遞了錯誤的編碼(當BOM存在時顯然會被忽略)。那麼,當我閱讀一個沒有BOM的UTF編碼文本文件時(我檢查過),我們仍然可能會遇到問題。但是這樣的文件將非常罕見。感謝您對Encoding.GetString的提示。我忘記了這一點:-)會標記爲答案。 –

回答

4

漢斯的評論實際上給了我的問題的答案。樣品的Windows-1252:

string filePath = ... 
StorageFile file = await StorageFile.GetFileFromPathAsync(filePath); 
IBuffer buffer = await FileIO.ReadBufferAsync(file); 
byte[] fileData = buffer.ToArray(); 
Encoding encoding = Encoding.GetEncoding("Windows-1252"); 
string text = encoding.GetString(fileData, 0, fileData.Length); 
0

@JürgenBayerbuffer.ToArray()是不適用於我。

所以,與其寫:

string text = await FileIO.ReadTextAsync(file); 

我寫道:

IBuffer buffer = await FileIO.ReadBufferAsync(file); 
byte[] fileData; 
CryptographicBuffer.CopyToByteArray(buffer, out fileData); 
Encoding encoding = Encoding.GetEncoding("Windows-1252"); 
string text = encoding.GetString(fileData, 0, fileData.Length); 
+0

如果包含命名空間System.Runtime.InteropServices.WindowsRuntime,則ToArray是類WindowsRuntimeBufferExtensions提供的擴展方法。但是你的代碼看起來不錯:-) –

相關問題