villainの日記

2009-11-06 URLエンコード プラグイン を Perl に移植してみた

ATOKダイレクトのURLエンコード プラグインはRubyで書かれているようですのでこれをPerlに移植してみました。

package Atok_plugin;

use strict;
use utf8;
use Encode;

sub run_process
{
	my $a_request_data = shift;
	my %result_data;
	my @candidate_array;
	my $str = $a_request_data->{'composition_string'};

	# UTF-8
	push(@candidate_array, {
		'hyoki'   => &urlencode($str),
		'comment' => "UTF-8 エンコード\\n[$str]"
	});

	# Shift_JIS
	push(@candidate_array, {
		'hyoki'   => &urlencode($str, 'cp932'),
		'comment' => "Shift_JIS エンコード\\n[$str]"
	});

	# EUC-JP
	push(@candidate_array, {
		'hyoki'   => &urlencode($str, 'eucjp'),
		'comment' => "EUC-JP エンコード\\n[$str]"
	});

	# JIS
	push(@candidate_array, {
		'hyoki'   => &urlencode($str, 'jis'),
		'comment' => "JIS エンコード\\n[$str]"
	});

	$result_data{'candidate'} = \@candidate_array;

	return (%result_data);
}

#################################################

# URL エンコード
sub urlencode {
	my $str = shift;
	my $enc = shift || 'utf8';
	$str = encode($enc, $str);
	$str =~ s/(\W)/'%' . unpack('H2', $1)/ego;
	return $str;
}

1;

オリジナル版とは以下の動作が異なります。

  • 16進数の英字部分が小文字になる(?)
  • Shift_JISの綴り間違い(Shift-JISではない)を修正
  • JISのエンコードにも対応

それ以外は基本的に違いはないはずです。

なお、Encodeモジュールを利用しているので恐らくPerl 5.8.xかPerl 5.10.x以降じゃないと動作しないはずです。