読者です 読者をやめる 読者になる 読者になる

年金ロボットをめざして

FX(外国為替証拠金取引)自動運用ロボットの開発ブログのはずだった

wxBasic の日本語対応

wxBasic の日本語対応のために、ぼくが wxBasic の開発者 David Cuny に頼んで実現した苦肉の策が今回のテーマ「Option Backslash Off」。本来はもっと違う本格的なマルチバイト処理を望むところだけど、まぁ、これくらいならということで実現してもらうことができた。(10年くらい前の出来事だけどね)

今まで(前2回)これを書かなかったのは、できないじゃないか!どうやったの~というツッコミを期待してのことだったが、期待のツッコミは皆無だった。ぼくの誘惑を見てインストールしてみた人はいなかったということか。

実は今回「wxBasic 入門」なるタイトルで内容を書き始めようとしたのだが、まずはこれ(Option Backslash Off)をハッキリさせておこうと思った次第。

それにしても「wxBasic の日本語対応」とは大げさに構えてしまったが、その中身といえば Option Backslash Off(以後、面倒なので \off)だけなのだ。\off がなにをしているかといえば、想像がつくだろうけど、例えば「表」という漢字コードには \(バックシュラッシュ)が含まれており、それを wxBasic で扱おうとすると、

f:id:fxrobot:20131202083737j:plain

 こんなことになってしまう。

つまり wxBasic は知らないエスケープシーケンスを見つけたというエラーを出してしまうのだ。それを、知らないのなら無視しようよという指令が \off なのだ。でも、知っているエスケープシーケンスは有効だ。\n(改行)とかね。これが \off の正体だ。

で、実験してみた。

//----------------------------------------------------------------------------------------------------
Option Backslash Off
print "表計算"             //①=> OK
print "表\n計\n算\n"    //②=> OK
print "表"                    //③=> エラー
print "表 "                   //④=> "表" & space
print "表\n"                 //⑤=> "表n"
print "表\\n"                //⑥=> "表" & 改行
//⑦
print "―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭 "
//=> "―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭 "
//⑧
print "―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭\"
//=> "―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭"
//⑨
print "―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭\" & "表計算"
//=> "―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭表計算"
print "表 "[1]                //⑩=> "・"
print "表 "[2]                //⑪=> "\"
print "表 "[3]                //⑫=> " "
kanji="―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭\" //漢字 37文字
print len(kanji)             //⑬=> 74
//⑭
for i=1 to len(kanji)
    print kanji[i];
end for
//⑮=> "・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\・\"
//----------------------------------------------------------------------------------------------------

 まずは ① を見てほしい。\off によって「表計算」の print が正常にできている。もし、\off がないと、シンタックスエラー(知らないエスケープシーケンスを見つけた)になってしまうのだ。

② は文字列のなかに \n(改行)を含めたが正常に print できている。

③ が問題で、こりゃバグといえるだろうね。\off を含む漢字が文字列の最後に来たときに起こるエラーだ。④ のように最後に space(半角スペース)を加えればエラーを回避できる。

f:id:fxrobot:20131202085151j:plain

 でも、それじゃ困るよね。

で、表のあとに \n(改行)を加えてみた。つまり "表\n" 。これで解決するわけじゃないけど、果たしてどうなるのか。それが ⑤ で、なんと "表n" と表示したのだ。

⑥ の "表\\n" のように \ を2つ並べれば本来の "表\n" の期待に応えてくれる。対処療法だが、\ を含んだ漢字が文字列の最後に来る場合かつ最後に改行を加えたい場合は例えば "表表表表表\\n" のようにする。まだ解決していないがそれはあとで。

⑦ は、\ を含む漢字の勢揃い。最後に space を加えてとりあえず回避している。次に ⑧ をみてほしい。最後に space ではなく \ を加えている。これで問題を回避できる。

⑨ で \ が邪魔になっていないことを確認している。

⑩⑪⑫ は、"表 " という文字列(表のあとに space がある)の 1バイト目、2バイト目、バイト目のそれぞれを print している。

⑬ は、どのなかにも \ を含む37文字の漢字列の最後に \ を加えて、そのバイト数を確認したもので、答は 74 となった。予想したどおりだ。

⑭ は for ループで 74 バイトのすべてを print してみた。結果は ⑮ のとおり。いずれの漢字も \ が後部にあるんだね。恥ずかしながら知らなかった。

これで wxBasic の日本語対応の話は終わりにしたいが、なんだか昔の Perl みたいだね。制限のあるものを工夫して使う楽しさかな。:P
f:id:fxrobot:20131202101509j:plain
ところで、wxBasic はインタプリタ言語で、thinBasic も AutoIt も同じことだろうが、それらには exe を作るツールが付いている。これは一般的に Binding Tool と呼ばれるもので、wxBasic にも baind.exe が添付されている。また bind.exe のソースコード(bind.wxb)も付いている。

ぼくは bind.wxb のちょっと古い(というかぼくがちょっと中身をいじっていたかも)ソースコードを C:\Program Files (x86)\wxbasic\ のなかで実行していたのでうまく動かなかったようだが、C:\wxbasic\ 下で 2.8 版に添付の bind.exe を動かすことで以下のとおりうまくいった。(情けなぁ)

f:id:fxrobot:20131202125732j:plain

ただし、バインドした test.exe のなかを覗くとソースコードがまる見えだ。それじゃ困るという人は、これを使おう! nandemoExe だ。これスグレものだよ。

【 nandemoExe - http://www.vector.co.jp/soft/win95/util/se487809.html

f:id:fxrobot:20131202095605j:plain

ソースコードファイルを exe ファイル化してくれる。それにソースコードを暗号化してくれるぞ。Packer 機能も付いているが使う必要はないだろう。

f:id:fxrobot:20131202100116j:plain

nandemoExe はアイコンの指定もできる。ぼくも試してみたが、wxFrame.exe のサイズは 21kb だよ。で、wxFrame.exe をダブルクリックすれば実行。ただし wxBasic に関連づけされている必要がある。21kb の wxFrame.exe だけを配布して使ってもらうのもいいだろうし、インストーラで提供し、そのなかに wxFrame.exe と wxBasic.exe を含み、インストーラで関連づけをおこなえば、ユーザーにとっては完全な Windows アプリケーションだろう。

これである程度外堀は埋めることができただろうか。
次は「wxBasic 入門」を書くかどうか。
それはわからない。