気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
前回、ライブラリを使用してYouTubeからフィードを取得することが出来たのですが、
検索ワードに日本語を指定すると、明らかに結果がおかしい。。
英語だと問題ないのだが。

よくよく調べてみると原因が判明しました。

フィードを検索する際にこんな感じで記述しているのですが、

YouTubeQuery query = new YouTubeQuery();
query.Uri = new Uri(
                   String.Format("http://gdata.youtube.com/feeds/api/videos?vq={0}", 
                   HttpUtility.UrlEncode(args[0]))
                 );
YouTubeFeed feed = service.Query(query);

このUriクラスがくせものでした。.NETのドキュメントによると、このクラスのUriプロパティは
「127 より大きい Unicode 値の文字はすべて、それと等価の 16 進数値に置換されます」と書かれています。
つまり、日本語などは勝手にUnicodeを表す16進数にエンコードされてしまうのです。

Google Data APIではURIはUTF-8でエンコードする必要があるため、ちゃんとした結果が返ってこないのでした。

さて、どうしようかと悩み、結局、ライブラリのソースコードもZIPに含まれていたので一部ライブラリを修正することにしました。

WebRequestを生成する部分を以下のように修正(Core Clientプロジェクトのrequest.cs)

//this.webRequest = WebRequest.Create(this.targetUri);	//521行目
this.webRequest = WebRequest.Create(Uri.UnescapeDataString(targetUri.AbsoluteUri));

Uriクラスが持つ文字列をデコードして元のURI文字列を取得し、そいつを渡して WebRequestクラスのインスタンスを生成するようにしました。

これでビルドして、実行してみたところ、上手く取得できました!!!
他にもっと良い方法があるかもしれませんが、とりあえず解決。

次は、Flash PlayerをWindowsフォームから利用するところをやりたいと思います。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/2-d8332e5b

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。