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

日テレアプリで石原さとみを検索しようとしたら文字化けして困ってしまった。 どうにかURIモジュールを使ってやろうと思って調べたら、実はブックマークしていた記事にたどり着いた。 参考:URIモジュールにutf8フラグつきの文字列を食わせたらquery_formのエンコードが化けたでござるの巻 - とあるモバイル系エンジニアの日々 この記事を踏まえた結論としては、query_formを使うときは、「no utf8」のスコープでやるのが良い、ということ。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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」のスコープを作って、その中で代入を行うと、あら不思議。 ちゃんと望んだとおりの変換をしてくれました。 これで一件落着です。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy