読者です 読者をやめる 読者になる 読者になる

WebBrowserTaskのバグ回避のためにBASE64でリダイレクトできるものをつくった

2011/02/12(Sat) 追記

この問題はWebBrowserTask.URLに渡すURLを事前にエスケープしておかなければならないという仕様でした。よってこの記事の方法を採用する必要はありません。

詳しくは、以下の記事をご覧ください。

WebBrowserTaskに渡すURLはUri.EscapeDataStringしておく必要がある - backyard of 伊勢的新常識

BASE64にしたURLでリダイレクトできる b64redirect.iseteki.net を作りました。使い方は簡単。http://b64redirect.iseteki.net/(BASE64エンコードしたURL) で開くだけです。

こんなもんが必要になった背景ですが、Windows Phone 7のWebBrowserTaskという、内蔵Internet Explorerを起動するクラスのバグがあったからです。

WebBrowserTask には、パラメータとしてURLを引き渡せるのですが、このURLに&を含めると、その&以後がすべて欠落してしまいます。たとえば、こういうコードを書いた場合、エンコーディングの&ie以降が落ちるため文字化けします。

WebBrowserTask task = new WebBrowserTask();
task.URL = "http://www.google.co.jp/search?q=" + Uri.EscapeUriString(searchWordTextBox.Text) + "&ie=utf-8&oe=utf-8";
task.Show();

はてなモノリスなど一部のWebサービスでは、&の代わりに;を使うことにより問題を回避することができるのですが、Googleでは回避できないし、ちまたのURL短縮サービスを使おうとすると、URLを作るためのリクエストをしなくといけなくて面倒だったので、BASE64エンコードなら&も含まないからいいかなーと思ってやってみました。

上のコードはこんな感じで書き直すことができます。

string url = "http://www.google.co.jp/search?q=" + Uri.EscapeUriString(searchWordTextBox.Text) + "&ie=utf-8&oe=utf-8";

WebBrowserTask task = new WebBrowserTask();
task.URL = "http://b64redirect.iseteki.net/" + Convert.ToBase64String(Encoding.UTF8.GetBytes(url));
task.Show();

ご自由に利用して頂いてかまいませんが、このサイトを経由していると言うことだけ書いておいてください。というかWebBrowserTaskさっさとなおしてくれMSー!