というわけで、patchを送っときました。

404 Blog Not Found:はてなキーワード連想語API vs. XMLRPC::Lite
そうなのです。XMLRPC::Liteは、Non-ASCIIな文字列はbase64でおくっておったのですね。
はてなブックマーク - torumのブックマーク/ 2006年02月16日
XML-RPCでNon-ASCIIな文字列をBase64エンコーディングしない、と仕様自体が改善されてからもう結構たったから、これはXMLRPC::Liteのバグかと...。

それで以下を見ると、確かにそうなってます。

XML-RPC Specification
Updated 6/30/03 DW Removed "ASCII" from definition of string.

とはいえ、こういうプロトコルの仕様変更の場合には、実装側でも新旧両方に対処しといた方がいいので、はてなにおかれてはBase64された場合の対処もお願いしつつ、Module側でも新旧両方に対処してもらうというのが筋。もちろんModule User側で

XMLRPC::Lite (SOAP::Lite) で base64 エンコーディングさせない: blog.bulknews.net
my $res = XMLRPC::Lite->new->proxy('http://d.hatena.ne.jp/xmlrpc')
   ->call('hatena.getSimilarWord', 
          { wordlist => [ XMLRPC::Data->type(string => "はてな") ] }
   );
 

とするのも一向だけど、あまりバッドノウハウは貯めたくないし、というわけで、とりあえず以下のpatchを作者に送付しておきました。

use XMLRPC::Lite -nobase64;

とするか、$XMLRPC::Serializer::USE_BASE64 = 0;とするかすると、base64 encodingを行わなくなります。

Dan the CPAN Committer

diff -ruN SOAP-Lite-0.60/lib/XMLRPC/Lite.pm SOAP-Lite-0.60-dan/lib/XMLRPC/Lite.pm
--- SOAP-Lite-0.60/lib/XMLRPC/Lite.pm   2006-02-16 20:38:46.000000000 +0900
+++ SOAP-Lite-0.60-dan/lib/XMLRPC/Lite.pm       2003-08-19 03:44:29.000000000 +0900
@@ -15,14 +15,6 @@
 use vars qw($VERSION);
 $VERSION = sprintf("%d.%s", map {s/_//g; $_} q$Name: release-0_60-public $ =~ /-(\d+)_([\d_]+)/);
 
-sub import{
-    my $class = shift;
-    my %arg = map { $_ => 1 } @_;
-    if (exists $arg{-utf8string} || exists $arg{-nobase64}){
-       $XMLRPC::Serializer::USE_BASE64 = 0;
-    }
-}
-
 # ======================================================================
 
 package XMLRPC::Constants;
@@ -53,25 +45,19 @@
 
 @XMLRPC::Serializer::ISA = qw(SOAP::Serializer);
 
-our $USE_BASE64 = 1;
-
 sub new {
   my $self = shift;
+
   unless (ref $self) {
     my $class = ref($self) || $self;
-    my %typelookup = 
-       (
-        int    => [20, sub {$_[0] =~ /^[+-]?\d+$/}, 'as_int'],
-        double => [30, sub {$_[0] =~ /^(-?(?:\d+(?:\.\d*)?|\.\d+)|([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)$/}, 'as_double'],
-        dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'],
-        string => [40, sub {1}, 'as_string'],
-       );
-    if ($USE_BASE64){
-       $typelookup{base64} =
-           [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'];
-    };
     $self = $class->SUPER::new(
-      typelookup => \%typelookup,
+      typelookup => {
+        base64 => [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'],
+        int    => [20, sub {$_[0] =~ /^[+-]?\d+$/}, 'as_int'],
+        double => [30, sub {$_[0] =~ /^(-?(?:\d+(?:\.\d*)?|\.\d+)|([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)$/}, 'as_double'],
+        dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'],
+        string => [40, sub {1}, 'as_string'],
+      },
       attr => {},
       namespaces => {},
       @_,