ReadText из файла в кодировке ANSII
Я использую библиотеку Q42.Winrt для загрузки html-файла в кеш. Но когда я использую ReadTextAsync, у меня есть исключение:
В целевой многобайтовой кодовой странице нет сопоставления для символа Unicode. (Исключение из HRESULT: 0x80070459)
Мой код очень простой
var parsedPage = await WebDataCache.GetAsync(new Uri(String.Format("http://someUrl.here")));
var parsedStream = await FileIO.ReadTextAsync(parsedPage);
Я открываю скачанный файл и там есть ANSII кодировка. Я думаю, что мне нужно конвертировать его в UTF-8, но я не знаю как.
1 ответ
Проблема заключается в том, что кодировка исходной страницы не в 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 этой страницы показывает кодовую страницу, но эта информация не сохраняется в файле.