从ansi编码的文件中读取文本

本文关键字:读取 取文本 文件 ansi 编码 | 更新日期: 2023-09-27 18:14:22

我用Q42。Winrt库下载html文件缓存。但是当我使用ReadTextAsync时,我有异常:

目标多字节代码页中不存在Unicode字符的映射。(Exception from HRESULT: 0x80070459)

我的代码很简单
var parsedPage = await WebDataCache.GetAsync(new Uri(String.Format("http://someUrl.here")));
var parsedStream = await FileIO.ReadTextAsync(parsedPage);

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

从ansi编码的文件中读取文本

问题是原始页面的编码不是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是您可以从web获得的,但并非总是如此。该页的Content-Type响应头显示了代码页,但是该信息没有存储在文件中。