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 этой страницы показывает кодовую страницу, но эта информация не сохраняется в файле.

Другие вопросы по тегам