【问题标题】:ReadText from file in ANSII encoding从 ANSII 编码的文件中读取文本
【发布时间】:2013-05-19 17:13:00
【问题描述】:

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

【问题讨论】:

  • 该错误似乎与您观察到的 ANSI 不一致(您是如何确定的?),但无论如何,ReadTextAsync 有一个重载,允许您提供 Unicode 编码以匹配源文件。也许这会让你走得更远?
  • 我在 Notepad++ 中打开下载的文件并查看 ANSI 编码。我尝试重载 ReadTextAsync 并没有帮助。
  • 您有我们可以查看的文件/网址吗?
  • 是的。请尝试下载link
  • 请确认文件链接,看起来不正确

标签: c# xaml windows-8 microsoft-metro


【解决方案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 响应标头显示代码页,但该信息未存储在文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多