作者: Koichi Yamamoto
日時: 2003/3/10(19:58)
こんにちは、山本です。

"<s-imai@...>"さんは書きました:
> となると、#コメントの記述で注意すべき点は、
> 1) コメントをJISやSJISで書くのは避ける
>    → できれば英語で書きましょう!

日本語版以外のWindowsでTclスクリプトを動かすのであれば、
Javaのnative2ascii相当のプログラムを使って非ASCII文字を
\uXXXX形式に変換してしまう、という手もあります。

例えば、以下のスクリプトをnative2asciiしてやると:
    proc test {} {
    # ボ ← SJISの場合、2バイト目がopen brace
    puts こんにちは、世界。
    }
    test

↓のようになります:
    proc test {} {
    # \u30dc \u2190 SJIS\u306e\u5834\u5408\u30012\u30d0\u30a4\u30c8\u76ee\u304copen brace
    puts \u3053\u3093\u306b\u3061\u306f\u3001\u4e16\u754c\u3002
    }
    test

こうすればSJIS文字の中に含まれるbrace記号のせいで
挙動がおかしくなることは無いだろうと思います。


以下はTcl/Tk版native2ascii.tclです。私が公開している「Drop on Script」と
組み合わせて使えば、Tclスクリプトファイルにドラッグ&ドロップするだけで
変換できるようになります:

# //////////////////////////////////////////////////////////
#    native2ascii.tcl
#        非ASCII文字を\uhhhhに置き換えるスクリプト
# //////////////////////////////////////////////////////////
pack [text .t -width 80 -height 20 -yscrollcommand {.sy set}] -side left -expand yes -fill both
pack [scrollbar .sy -orient vertical -command {.t yview}] -side right -expand yes -fill y
foreach filename $argv {
    file rename -force -- $filename $filename.bak
    .t insert end $filename...
    update
    set fi [open $filename.bak]
    set fo [open $filename w]
    while {[gets $fi line] >= 0} {
        set oline ""
        for {set i 0} {[set c [string index $line $i]] != ""} {incr i} {
            if {$c < "\x80"} {append oline $c} {append oline \\u[format %04x [scan $c %c]]}
        }
        puts $fo $oline
    }
    close $fi
    close $fo
    .t insert end 終了\n
    .t see end
}
tk_messageBox -message 終了しました。
exit

--
Koichi Yamamoto, 
http://homepage3.nifty.com/yamakox/