Tclスクリプトにマルチバイト文字が入ってると、環境によっては文字化けして実行できないという問題がありました。
コメントは英語表記にしてあるのでいいとして、ギリシャ文字のシグマとか、パスワード隠し記号とかは見た目上どうしても使いたいので、そういう記号は全部Unicodeリテラル表記にしました。ここのツールを使うと簡単にUnicodeリテラルを調べられます。
http://www.snible.org/java2/uni2java.html
ついでに、あとでリテラルが何の記号に対応するかみたいという場合もあると思って、以下のようなスクリプトを書きました。
これでリテラルを展開した結果を見られます。
# filename: subst_unicode_literal.tcl proc read_file {f} { set ch [open $f r] set out [read $ch] close $ch return $out } proc extract_unicode_literals {str _ll _lu} { upvar $_ll ll upvar $_lu lu set ll [lsort -unique [regexp -all -inline -expanded {(\\u[0-9A-Fa-f]{4})} $str]] set lu [subst [join $ll]] } proc make_map {ll lu} { set map {} foreach l $ll u $lu { lappend map $l $u } return $map } set f [lindex $argv 0] set str [read_file $f] set ll {} set lu {} extract_unicode_literals $str ll lu set map [make_map $ll $lu] set out [string map $map $str] puts -nonewline $out |
仕組みとしては単に\uXXXXという文字を見つけて、置換してるだけです。
Tclの場合は、Unicodeは16bitまでしか定義されてないので、リテラル表記は例外なくこれで処理できるようです。
なお、{\uXXXX}という表記はリテラルとはみなされないのですが、ここでは考慮してません。