c# - 从 ANSII 编码的文件中读取文本

标签 c# xaml windows-8 microsoft-metro

我使用 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,但我不知道如何操作。

最佳答案

问题是原始页面的编码不是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 响应 header 显示代码页,但该信息未存储在文件中。

关于c# - 从 ANSII 编码的文件中读取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637257/

相关文章:

c# - 在解决方案资源管理器中的文件下添加文件

xaml - Windows Phone 8 导航回同一页面

xaml - 当文本变为粗体时防止内容调整大小

c# - WININET.InternetConnect 在 Windows 8 中失败

multithreading - 从另一个线程WinRT中的ViewModel更新INotifyPropertyChanged-property

c# - 在 Windows 8/WinRT/XAML 应用程序中列出时区?

c# - 将类的多个属性传递给函数并返回自定义属性的值

c# - 为什么 Postfix++/-- 在 C# 中被归类为主要运算符?

C# OutOfMemory、映射内存文件或临时数据库

c# - Windows 8 应用商店应用全局 View 模型