#!/usr/bin/perl # -*- coding: shift_jis -*- # bellda layout : a Japanese keyboard layout like 'pocket bell' input method # Time-stamp: # original script: http://www.massangeana.com/mas/charsets/hana/hanasetup.htm # this script: http://ai11.net/2008/05/22/ # requirement: Solaris10 # Usage: [foo@bash]$ perl bellda-atok-solaris.pl < /usr/share/iiim/le/atokx2/original/a17msime.sty > ~/.iiim/le/atokx2/users/foo/bellda17msime.sty $romakana = 'ww=ア|we=イ|wr=ウ|ws=エ|wd=オ|ew=カ|ee=キ|er=ク|es=ケ|ed=コ|rw=サ|'. 're=シ|rr=ス|rs=セ|rd=ソ|sw=タ|se=チ|sr=ツ|ss=テ|sd=ト|dw=ナ|de=ニ|'. 'dr=ヌ|ds=ネ|dd=ノ|fw=ハ|fe=ヒ|fr=フ|fs=ヘ|fd=ホ|xw=マ|xe=ミ|xr=ム|'. 'xs=メ|xd=モ|cw=ヤ|ce=、|cr=ユ|cs=。|cd=ヨ|vw=ラ|ve=リ|vr=ル|vs=レ|'. 'vd=ロ|gw=ワ|ge=ヲ|gr=ン|gs=゙|gd=゚|aw=ャ|ae=「|ar=ュ|as=」|ad=ョ|'. 'af=ッ|qw=ァ|qe=ィ|qr=ゥ|qs=ェ|qd=ォ|fv=ー|z=゙|t=゚|wu=ア|wi=イ|'. 'wo=ウ|wj=エ|wk=オ|eu=カ|ei=キ|eo=ク|ej=ケ|ek=コ|ru=サ|ri=シ|ro=ス|'. 'rj=セ|rk=ソ|su=タ|si=チ|so=ツ|sj=テ|sk=ト|du=ナ|di=ニ|do=ヌ|dj=ネ|'. 'dk=ノ|fu=ハ|fi=ヒ|fo=フ|fj=ヘ|fk=ホ|xu=マ|xi=ミ|xo=ム|xj=メ|xk=モ|'. 'cu=ヤ|ci=、|co=ユ|cj=。|ck=ヨ|vu=ラ|vi=リ|vo=ル|vj=レ|vk=ロ|gu=ワ|'. 'gi=ヲ|go=ン|gj=゙|gk=゚|au=ャ|ai=「|ao=ュ|aj=」|ak=ョ|al=ッ|qu=ァ|'. 'qi=ィ|qo=ゥ|qj=ェ|qk=ォ|f.=ー|n=゙|p=゚|'; @romakana_table = sort(split('\\|', $romakana)); while (<>) { next if (/^[ \t]*\;/); # ".*" is a dirty trick to make RE work on plain Perl. # 8文字飛ばしてそのあとの8文字が $1 に # WindowsのATOK2006,2007,2008は Shift_JIS # if (/^ロ.*マ字=........(........)/) { # $_ = 'ローマ字=' . &convert($1) . "\n"; # ATOK for Solaris (ATOK17 for Solaris10)は UTF-8 if (/^\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x9e\xe5\xad\x97=........(........)/) { $_ = "\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x9e\xe5\xad\x97=" . &convert($1) . "\n"; } print; } sub nhex { # value , width local ($val, $wid) = @_; sprintf("%0${wid}x", $val); } sub convert { # $rが求めている文字列。 # まず 「ローマ字=対応日本語」の要素数+1を、%08x で出力。そのあと8文字はもともとのを出力。 local ($r) = &nhex($#romakana_table + 1, 8) . $_[0]; local ($i, $c, $sum, $nroma, $nkana); # ローマ字の最初の1文字の出てくる頻度を探る。 for (@romakana_table) { /^(.)/; $FREQ{$1}++; } $sum = 0; for ($i = 0x20; $i <= 0x7f; $i++) { # pack'C'→unsigned char。 $iが0x61のときは $c は 'a' になる。 $c = pack('C', $i); # 16進数4文字で計、16進数4文字で 0x20〜0x7fの各文字の頻度 $r .= &nhex($sum, 4) . &nhex($FREQ{$c}, 4); $sum += $FREQ{$c}; } $sum = 0; for (@romakana_table) { /^(.+)\=(.+)$/; $nroma = length($1); $nkana = length($2); # 16進数4文字で計、16進数2文字でローマ字1要素の長さ、16進数2文字でかな1文字ぶんの長さ $r .= &nhex($sum, 4) . &nhex($nroma, 2) . &nhex($nkana, 2); $sum += $nroma + $nkana; } for (@romakana_table) { /^(.+)\=(.+)$/; for $i (unpack('C*', $1)) { # unpack('C*') で、'a'が [97(0x61)]、"abc"が [97,98,99] になる。配列で返すので注意。 # 16進数4文字でローマ字1要素の1文字ずつ ('ww' だったら 'w' 'w'の2ループ) $r .= &nhex($i, 4); } for $i (unpack('C*', $2)) { # 'ア' (ShiftJIS 0xb1)なら、UCS2 Halfwidth Katakana の 0xff71 になる。 $r .= &nhex($i - 0xa0 + 0xff60, 4); # convert to UCS } } $r; }