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ー!