URIモジュールのquery_formを上手く使う方法

2009年3月17日
| コメント(0) | トラックバック(0) URIモジュールのquery_formを上手く使う方法

日テレアプリで石原さとみを検索しようとしたら文字化けして困ってしまった。
どうにかURIモジュールを使ってやろうと思って調べたら、実はブックマークしていた記事にたどり着いた。

参考:URIモジュールにutf8フラグつきの文字列を食わせたらquery_formのエンコードが化けたでござるの巻 - とあるモバイル系エンジニアの日々

この記事を踏まえた結論としては、query_formを使うときは、「no utf8」のスコープでやるのが良い、ということ。

この記事の中では、utf8フラグを落としてからURIモジュールを使う、ということをしているのだが、今回、日テレアプリで使うAPIは、Shift_JISのURIエスケープで渡してやる必要があるので、少しだけ変更する。

# Webpage: http://appli.ntv.co.jp/appli/api/program/index.html
 
use strict;
use warnings;
use utf8;
use YAML;sub p (@) { print Dump(@_) }
 
use LWP::UserAgent ();
use URI ();
use Encode ();
 
my $ua = LWP::UserAgent->new;
 
my $cast = Encode::encode('cp932', q{石原さとみ});# %90%CE%8C%B4%82%B3%82%C6%82%DD
my $key  = 'your api key';
my $uri  = URI->new('http://appli.ntv.co.jp/ntv_WebAPI/program/');
 
{
    no utf8;
    $uri->query_form(
        key  => $key,
        cast => $cast,
    );
}
p $uri;
 
# __END__
my $res = $ua->mirror($uri, 'ntv-apikey.pl.xml')->message;
p $res;

まず文字列をencodeしてcp932のバイト列へ変換します。
で、これを「use utf8」のスコープ内でquery_formへの代入を実行すると、keyやらcastという裸のワードに文字列フラグが付くのか、「%90%CE%8C%B4%82%B3%82%C6%82%DD」となってほしいところが「%C2%90%C3%8E%C2%8C%C2%B4%C2%82%C2%B3%C2%82%C3%86%C2%82%C3%9D」という風になってしまう。
そこで、「no utf8」のスコープを作って、その中で代入を行うと、あら不思議。
ちゃんと望んだとおりの変換をしてくれました。

これで一件落着です。

トラックバック(0)

このブログ記事に対するトラックバックURL:

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2009年3月17日 00:19に書いたブログ記事です。

ひとつ前のブログ記事は「StrawberryPerlにNet-SSLeayをインストールする」です。

次のブログ記事は「NanoAの最新版がインストールできなくて困った件」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type