来自ANSII编码文件的ReadText

The*_*heX 1 c# xaml microsoft-metro windows-8

我使用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);
Run Code Online (Sandbox Code Playgroud)

我打开下载的文件,有ANSII编码.我想我需要将它转换为UTF-8,但我不知道如何.

Jim*_*eil 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);
        }
Run Code Online (Sandbox Code Playgroud)

挑战是你不知道存储的字节是什么代码页,所以它在这里工作,但可能不适用于其他网站.通常,UTF-8是您从网上获得的,但并非总是如此.此页面的Content-Type响应标头显示代码页,但该信息未存储在文件中.