SL4AのPerl for Androidでマルチバイト文字を使う際に落ちる件
SL4AのPerl for Androidで日本語(マルチバイト文字)をRPCで使うとエラーが発生します。
原因は Android.pm で RPCの為にパラメータをto_json()/from_json()で処理する際にutf8オプションが使用されていないことです。解決するにはAndroid.pmのdo_rpc()を以下のように変更する必要があります。(もしくはto_json/from_jsonをencode_json/decode_jsonに変える)
sub do_rpc { my $self = shift; if ( $self->trace ) { show_trace(qq[do_rpc: $self: @_]); } my $method = pop; my $request = to_json( { id => $self->{id}, method => $method, params => [@_] }, { utf8 => 1 } ); if ( defined $self->{conn} ) { print { $self->{conn} } $request, "\n"; if ( $self->trace ) { show_trace(qq[client: sent: "$request"]); } $self->{id}++; my $response = readline( $self->{conn} ); chomp $response; if ( $self->trace ) { show_trace(qq[client: rcvd: "$response"]); } if ( defined $response && length $response ) { my $result = from_json( $response, { utf8 => 1 } ); my $success = 0; my $error; if ( defined $result ) { if ( ref $result eq 'HASH' ) { if ( defined $result->{error} ) { $error = to_json( { error => $result->{error} }, { utf8 => 1 } ); } else { $success = 1; } } else { $error = "illegal JSON reply: $result"; } } unless ( $success || defined $error ) { $error = "unknown JSON error"; } if ( defined $error ) { printf STDERR "$0: client: error: %s\n", $error; } if ( $Opt{trace} ) { print STDERR Data::Dumper->Dump( [$result], [qw(result)] ); } return $result; } } $self->close; return; }
上記のサブルーチンでAndroid.pmにモンキーパッチ当ててしまえば日本語を問題なく扱えるようになります。