#!/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/12/ # requirement: (Windows) ActivePerl # Usage: [Windows CommandPrompt]> c:\Perl\bin\perl.exe bellda-atok.pl < ATOK21.STY > BELLDA21.STY # Usage: [Solaris Terminal]$ perl bellda-atok.pl -u < /usr/share/iiim/le/atokx2/original/atok17.sty > ~/.iiim/le/atokx2/users/USRNAME/bellda17.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=゚|uu=ア|ui=イ|uo=ウ|uj=エ|uk=オ|iu=カ|'. 'ii=キ|io=ク|ij=ケ|ik=コ|ou=サ|oi=シ|oo=ス|oj=セ|ok=ソ|ju=タ|ji=チ|'. 'jo=ツ|jj=テ|jk=ト|ku=ナ|ki=ニ|ko=ヌ|kj=ネ|kk=ノ|lu=ハ|li=ヒ|lo=フ|'. 'lj=ヘ|lk=ホ|mu=マ|mi=ミ|mo=ム|mj=メ|mk=モ|,u=ヤ|,i=、|,o=ユ|,j=。|'. ',k=ヨ|.u=ラ|.i=リ|.o=ル|.j=レ|.k=ロ|;u=ワ|;i=ヲ|;o=ン|;j=゙|;k=゚|'. 'hu=ャ|hi=「|ho=ュ|hj=」|hk=ョ|hl=ッ|yu=ァ|yi=ィ|yo=ゥ|yj=ェ|yk=ォ|'. 'l.=ー|uw=ア|ue=イ|ur=ウ|us=エ|ud=オ|iw=カ|ie=キ|ir=ク|is=ケ|id=コ|'. 'ow=サ|oe=シ|or=ス|os=セ|od=ソ|jw=タ|je=チ|jr=ツ|js=テ|jd=ト|kw=ナ|'. 'ke=ニ|kr=ヌ|ks=ネ|kd=ノ|lw=ハ|le=ヒ|lr=フ|ls=ヘ|ld=ホ|mw=マ|me=ミ|'. 'mr=ム|ms=メ|md=モ|,w=ヤ|,e=、|,r=ユ|,s=。|,d=ヨ|.w=ラ|.e=リ|.r=ル|'. '.s=レ|.d=ロ|;w=ワ|;e=ヲ|;r=ン|;s=゙|;d=゚|hw=ャ|he=「|hr=ュ|hs=」|'. 'hd=ョ|hf=ッ|yw=ァ|ye=ィ|yr=ゥ|ys=ェ|yd=ォ|lv=ー|'; @romakana_table = sort(split('\\|', $romakana)); my $charcode="shift_jis"; if ($ARGV[0] =~ /\-+u(tf8)?/){ $charcode = "utf-8"; } 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 ($charcode eq "shift_jis" and /^ロ.*マ字=........(........)/) { $_ = 'ローマ字=' . &convert($1) . "\n"; } # ATOK for Solaris (ATOK17 for Solaris10)は UTF-8 if ($charcode eq "utf-8" and /^\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) { /^(.+)\=(.+)$/; # nkanaの数値は1以外があるのか…? $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; }