音楽とかソフトとか

WindowsのActiveTclはフリーソフト開発でよくお世話になっているプログラミング言語ですが、日本語処理でつまづくことがこれまでに何度もありました。その度に原因を調べ、対応策を考え、そしてすっかり忘れて(←オイ)しまいます。

先日setParam内のりぶあんを実行しようとしたところ、日本語フォルダでは失敗することに気づきました。そこで今回はエラーの状況をメモしておこうと思います。

setParam用に改造したりぶあんへは、処理対象のフォルダ名をコマンドライン引数で渡しています。「りぶあん wavフォルダ名 出力oto.ini名」といった具合です。コマンドライン引数のフォルダ文字列に日本語が混じっているとき、tclファイルで実行した場合は正しく処理されるのに、sdx.batを使って作ったexeファイルではエラーが出るようです。

ということで、作製したエラー検証用プログラムは以下のとおりです。

#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

if {$argc != 1} {
puts "usage: $argv0 dirname"
exit
}

set dir [lindex $argv 0]
puts "$dir"
cd "$dir"
puts [pwd]



これで、> ./argv.tcl 日本語フォルダ と実行すると正しくcdされました。ところがこれをsdx.batでexe化して同じく実行すると以下のエラーが出ました。
exe化したTcl/Tkプログラムの引数に日本語フォルダを与えたときのエラー


フォルダ名が文字化けしています。しかし上記ソースのcdをコメントアウトしてexe化して実行すると、puts "$dir"の結果が標準出力に出ますが、こちらは文字化けしませんでした。


次は日本語フォルダをtclファイルに埋め込み、それをsourceして取り込む場合です。これはうまくいきました。

検証用プログラムは以下のとおりです。

#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

if {$argc != 1} {
puts "usage: $argv0 tclfile"
exit
}

source [lindex $argv 0] ;# 引数で指定したtclを読む(中でset dirしてある)
puts "$dir"
cd "$dir"
puts [pwd]

label .l -textvar dir
pack .l


もう一つsourceOpt.tclという以下の内容のファイルを用意します。

set dir "./日本語"


これで > ./source.tcl sourceOpt.tcl は成功、> ./source.exe sourceOpt.tclも成功しました。
exe化したTcl/Tkの日本語フォルダ周りのテスト結果

ご覧のとおり、先の例と逆に標準出力で文字化け、Tcl/Tk GUI上では正しく日本語表示しています。これはこれで万事解決とはいかないようです。更に調査するとしたら、sdx周りのバージョンが気になるところですが、ひとまず現状の自分の環境で先に進むとしたら、このやり方を採用するしかないかなあと思っています。


<追記>

ついでにファイル読み込みでもいけるか試してみました。
検証用プログラムは以下のとおりです。

#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

if {$argc != 1} {
puts "usage: $argv0 fname"
exit
}

set in [open [lindex $argv 0] r]
set dir [gets $in]
close $in

puts "$dir"
cd "$dir"
puts [pwd]

label .l -textvar dir
pack .l


「./日本語」と書いたopen.txtを用意し、「open.tcl open.txt」といった具合に実行したところ、sourceのときと同様の結果が得られました。
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する