1

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に変換したいのですが、方法がわかりません。

4

1 に答える 1

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);
        }

問題は、格納されたバイトからコード ページが何であるかがわからないことです。そのため、ここでは機能しますが、他のサイトでは機能しない可能性があります。通常、UTF-8 は Web から取得するものですが、常にではありません。このページの Content-Type 応答ヘッダーにはコード ページが表示されますが、その情報はファイルに保存されません。

于 2013-05-21T23:44:55.213 に答える