ATOK2012のローマ字入力をDvorakY+独自変更にして2年ほど使っています。ローマ字テーブルはhata-atok.plを改造して作成したのだけど、スクリプトの配布元のサイトがなくなっていた。
何となく車輪の再発明をする気になり、Rubyで作り直した。作成にあたってはhttp://hossy.info/?date=1105 の解析内容を参考にさせてもらった。
ローマ字テーブルはGoogle日本語入力のフォーマットを採用した。これにより作ったローマ字テーブルがそのままGoogle日本語入力でも使えることになる。
Ruby1.9.3、ATOK2012で動作を確認しています。全てutf-8の文字コードでファイルを作成する必要あります。あと、ATOK正規のローマ字カスタマイズでは入力出来ない「,./」等も設定出来ますが、ATOKが正常に動作するかわかりません。ATOK2012では問題無く動いていますが、古いATOKではダメだったらしいです。
Rubyスクリプトのコード
# -*- coding: utf-8 -*- # ATOKのローマ字テーブルを生成する # ruby atok-tbl.rb [Google日本語入力のローマ字テーブル] [元styfile] [出力styfile] # 元styfileのローマ字定義部分を変更して、出力styfileを作成します。 # 例: # ruby atok-tbl.rb dvoraky.txt atok.sty dvoraky.sty # 注意:Ruby1.9.3以降、utf-8でないと動かないかもしれません。 require 'csv' require 'nkf' # 数値を指定の桁数で16進表記の文字列にする def nhex(i, od) sprintf("%0#{od}x", i) end # 文字列を16進数のコードの並びにする def bstr(str) x = str.encode("Shift_JIS") # styファイル内はsjisのコードで作られている x.bytes.collect {|b| b.to_s(16) }.join("") end romtbl = Array.new # ローマ字テーブル romhash = Hash.new(0) # ローマ字の先頭文字の個数 キー数カウント部で使用する # ローマ字テーブルファイル読み出し # Google日本語入力の生成物を前提 # ローマ字 [TABコード] ひらがな (必要なら)[TABコード]ローマ字※kkやssで拗音を入力するとき CSV.open(ARGV[0], "r", :col_sep=>"\t") {|cfile| cfile.each {|l| head = l[0][0] # 先頭の1文字目 # 変換後文字は半角カナに変換してしまう x = NKF.nkf('-w -h2', l[1]) l[1] = NKF.nkf('-w -Z4',x) ### 特例処理 ### if l.size > 2 if l[0][0] == l[0][1] # ooやmmなどで「っ」が入力される場合、2文字目は0x1fとなっている l[0][1] = 0x1f.chr end end # atokのローマ字テーブルで使用する半角カナで文字コードが無い hash = { 'ヵ'=>0x12.chr, 'ヶ'=>0x13.chr, 'ヮ'=>0x14.chr, 'ヰ'=>0x10.chr, 'ヱ'=>0x11.chr} l[1].gsub!(/[ヵヶヮヰヱ]/, hash) ################ romtbl.push l romhash[head] += 1 } } romtbl.sort_by! {|r| r[0] # ローマ字の先頭文字でsortする } dat = String.new # ローマ字テーブルデータ #ヘッダ部、キー数カウント部、辞書文字数カウント部、辞書部からなる # http://hossy.info/?date=1105 を参考 # ヘッダ部 hcount_b = bstr(nhex(romtbl.size, 8)) # ローマ字テーブルの個数 head = bstr("01000002") # 意味不明だけど固定 dat << hcount_b + head # キーカウント部 # ローマ字の先頭文字と変換テーブルの個数 sum = 0 for i in 0x20..0x7f #0x20から0x7fまでの文字コード毎の数を設定 num = romhash[i.chr] # 変換テーブルの個数 dat << bstr(nhex(sum,4)) + bstr(nhex(num,4)) sum += num end # 辞書文字数カウント部 #0285 0101 z=や #合計 入力数 出力数 sum = 0 romtbl.each {|l| nin = l[0].size # ローマ字の文字数 nout = l[1].size # 変換後の文字数 dat << bstr(nhex(sum,4)) + bstr(nhex(nin,2)) + bstr(nhex(nout,2)) sum = sum + nin + nout # それまでの合計文字数 } # 辞書部 # 入力文字コード(unicode) 出力コード(unicode) romtbl.each {|l| strin = "" l[0].codepoints {|cp| strin += bstr(nhex(cp, 4)) } strout = "" l[1].codepoints {|cp| strout += bstr(nhex(cp, 4)) } dat << strin + strout } # 終端処理 dat << "\r\n".unpack("H*").pop.scan(/[0-9a-f]{2}/).join("") # 元になるstyファイル styfile = File.open( ARGV[1], "rb" ) stydat = styfile.read.unpack("H*")[0] start = bstr('ローマ字=') # 場所を見つけて x = stydat.index(/#{start}.+/) cpi = x+start.bytesize #ローマ字=の次の位置(先頭) cpk = stydat.index(nhex(0x0a, 2), cpi) + 1 # ローマ字=以降で最初にでた0x0a # 置き換える stydat[cpi..cpk] = dat # ファイル出力 b_data = [stydat].pack("H*") rf = File.open(ARGV[2], "wb") rf.write(b_data) rf.close
自分が使っているDvorakY改のGoogle日本語入力のテーブル
DvorakYに対しAZIK的な独自変更を行っています。
文字と文字の間はTAB区切りです。
,, っ , ,a わ ,d うぇ ,g うぃ ,jd うぇ ,jg うぃ ,js うぉ ,s を .a ヴァ .d ヴェ .f ヴ .g ヴィ .s ヴォ .v ヴュ // っ / /a ざ /c じぇ /d ぜ /f ず /g じ /s ぞ /v じゅ /x じょ /z じゃ : ー ;; っ ; ;a さ ;c しぇ ;d せ ;f す ;g し ;s そ ;v しゅ ;x しょ ;z しゃ @,a ゎ @a ぁ @d ぇ @f ぅ @g ぃ @ia ヵ @id ヶ @kf っ @s ぉ @v ゅ @x ょ @z ゃ a あ c いぇ d え e 。 f う g い hh っ h h,f どぅ ha だ hc ぢぇ hd で hf づ hg ぢ hjf でゅ hjg でぃ hs ど hv ぢゅ hx ぢょ hz ぢゃ ii っ i i,a くぁ i,d くぇ i,g くぃ i,s くぉ ia か id け if く ig き is こ iv きゅ ix きょ iz きゃ jj っ j ja は jd へ jf ふ jg ひ js ほ jv ひゅ jx ひょ jz ひゃ kk っ k k,f とぅ k;a つぁ k;d つぇ k;g つぃ k;s つぉ ka た kc ちぇ kd て kf つ kg ち kjf てゅ kjg てぃ ks と kv ちゅ kx ちょ kz ちゃ ll っ l la な ld ね lf ぬ lg に ls の lv にゅ lx にょ lz にゃ mm っ m ma ま md め mf む mg み ms も mv みゅ mx みょ mz みゃ nn っ n na ば nd べ nf ぶ ng び ns ぼ nv びゅ nx びょ nz びゃ oo っ o oa ら od れ of る og り os ろ ov りゅ ox りょ oz りゃ r っ q ん pp っ p pa ぱ pd ぺ pf ぷ pg ぴ ps ぽ pv ぴゅ px ぴょ pz ぴゃ s お uu っ u u,a ぐぁ ua が ud げ uf ぐ ug ぎ us ご uv ぎゅ ux ぎょ uz ぎゃ v ゆ w 、 x よ ya ふぁ yd ふぇ yg ふぃ ys ふぉ yv ふゅ z や