xml-rpc

ちょっと必要があって,xml-rpc をつかうことになった.perl インタフェースが何種類もあるようなのだが,どうも,RPC::XML というのが一番充実しているふうであるので,使ってみた.だいたいは期待したように動作しているのだが,ご多分にもれず(?)日本語がうまく動かない.いや,サーバから日本語データを引っ張ってくるのは問題なのだが,日本語データを送ろうとするとうまくいかない.

  $param = "ascii data";
  $resp = $xmlrpc->send_request('methodname', $param);

は,ちゃんと動くのだが,1行目を

  $param = "日本語データ";

とすると,Wide character in subroutine entry at /usr/lib/perl5/site_perl/5.10/RPC/XML.pm line 409. といって怒られる.

この「Wide character in ....」というのを見ると,それだけで絶望的な気分になるのだけれど,まあ,見てみるか,と思って Google を引くと,すばらしいまとめがあることがわかった: http://www.rwds.net/kuroita/program/Perl_unicode.html ありがたいことである.

で,あらためて怒られている409行目やその呼び出し元などを見てみると,utf8::downgrade() なる関数に,この "日本語データ" という string がわたっていることがわかる.http://perldoc.perl.org/utf8.html を見てみると,どうも,ここには Latin-1 しか渡せないように見える.うーん.こりゃ,一般のUTF-8をサポートしているわけではないということなのかね.

というか,どうも,これを呼んでいるのは,perlの内部表現たるstringでなくて,バイトシークエンスとしてみたいからのようだ (違うのかな〜?).だったら,utf8::downgrade() じゃなくて,utf8::encode() を使ったらいいのでは,と思って,全部書き直してみる.(実際には,utf8::downgrade() が直接書いてあるのではなく,別の関数を utf8::downgrade() に定義し直していたので,1箇所直せばすむ.)

すると,ここは通過して,サーバにデータが送られるようになった.だが,サーバからエラーが返る.調べると,生成される XML データの先頭に encoding="us-ascii" と書いてある.なんのこっちゃ.(この辺で,やっぱりあんまり東洋のことなど考えていないのね,という気持ちになってくる) 幸い,これは,RPC::XML::ENCODING なる変数の値に "UTF-8" を設定しておけばよい,とのこと.

以上で,とりあえず動作するようになった.RPC::XML を1箇所書き直しているのが問題だけど.実際は,書き直さなくても,"日本語データ" を Encode::encode_utf8("日本語データ") で置き換えると動作するのだが,なんかあんまりだなー,と思う.