blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

DvorakJ と ATOK を併用すると文字が正常に出力されないことがあるとの指摘を受けた

表題の通り*1。Microsoft Windows Vista Home Premium Service Pack 3 で ATOK 2009 を使用している当方の環境では、この症状が再現されない。
何かしらの原因によりunicode 文字が正常に出力されていないと考えた。DvorakJ は AutoHotkey_L の機能を使用してunicode 文字の出力しているのだ。unicode 文字が正常に出力されるかを調べるにはどうすればよいだろうか?以下のスクリプトのように、AutoHotkey_L の機能を使用して出力する unicode 文字と、その他の文字の出力結果の違いを比較すればよいだろう。当方の環境では、IME を有効にし且つローマ字入力の状態で以下のスクリプトを実行すると、以下の画像中の最下段の通り出力される。

a::
; 「うんゆ」→「運輪」
send,[unnyu]{u+2192}{u+300C}{u+904B}{u+8F2A}{u+300D}
return


同様の問題が起きるときには、上記の文字列が正常に出力されるかを調べていただきたい。上記のスクリプトをコンパイルしたので、AutoHotkey_L を導入しなくともつぎのように操作するだけでこれを調べることが出来る。どのような文字列が出力されるでしょうか。

  1. ★Axfc UpLoader Scandium (〜2MB) -Sc_37986.zip-から圧縮ファイルをダウンロード
  2. キー配列変更ソフトを終了する
  3. IME を有効にしてローマ字入力に設定する
  4. unnyu.exe を実行
  5. Aを1回押す


追記:
上記のスクリプトを実行したら文字が正常に出力されたとの報告を受けた*2unicode 文字を直接出力する処理に問題はないようだ。
では、以下のスクリプトはどうだろうか。こちらのスクリプトは、特定の文字列を unicode の文字列へと変換し、それを出力するものだ。

ConvRawStrToUniStr(ByRef str)
{
	str := RegExReplace(str, "\x81\x45", "{u+30FB}", "", -1) ; ・
	str := RegExReplace(str, "\x81\x5E", "{u+FF0F}", "", -1) ; /
	str := RegExReplace(str, "\x81\x75", "{u+300C}", "", -1) ; 「
	str := RegExReplace(str, "\x81\x76", "{u+300D}", "", -1) ; 」
	str := RegExReplace(str, "\x81\x69", "{u+FF08}", "", -1) ; (
	str := RegExReplace(str, "\x81\x6A", "{u+FF09}", "", -1) ; )
	str := RegExReplace(str, "\x81\x48", "{u+FF1F}", "", -1) ; ?
	str := RegExReplace(str, "\x81\x49", "{u+FF01}", "", -1) ; !
	str := RegExReplace(str, "\x81\x43", "{u+FF0C}", "", -1) ; ,
	str := RegExReplace(str, "\x81\x44", "{u+FF0E}", "", -1) ; .
	str := RegExReplace(str, "\x81\x46", "{u+FF1A}", "", -1) ; :
	str := RegExReplace(str, "\x81\x47", "{u+FF1B}", "", -1) ; ;
	str := RegExReplace(str, "\x81\x97", "{u+FF20}", "", -1) ; @
	str := RegExReplace(str, "\x81\x96", "{u+FF0A}", "", -1) ; *
	str := RegExReplace(str, "\x81\x4F", "{u+FF3E}", "", -1) ; ^
	str := RegExReplace(str, "\x81\x8F", "{u+FFE5}", "", -1) ; ¥
	str := RegExReplace(str, "\x81\x6D", "{u+FF3B}", "", -1) ; [
	str := RegExReplace(str, "\x81\x6E", "{u+FF3D}", "", -1) ; ]

	return str
}

str := "・/「」()!?,.;:@*^¥[]"

a::
send,% ConvRawStrToUniStr(str)
return

このスクリプトも上記のスクリプトと同様にコンパイルした。作業手順も同様だ。一応書いておこう。

  1. ★Axfc UpLoader Scandium (〜2MB) -Sc_38042.zip-から圧縮ファイルをダウンロード
  2. キー配列変更ソフトを終了する
  3. IME を有効にしてローマ字入力に設定する
  4. uni.exe を実行
  5. Aを1回押す