国際化

Tcl8.1から国際化対応になっています。 内部コードにUnicode(UTF-8)を採用していて、
日本語の文字列操作もASCII文字と同様に扱えます。 日本語の入力や表示も行えます。

ここでは、国際化されたコマンドの一例を紹介します。

変数名

変数名にも日本語が使えます。

set 今日は こんにちは
=>こんにちは
puts $今日は
=>こんにちは

string

日本語の文字列もASCII文字列と同様に扱えます。

string length "abc"
=>3
string length "みかん"
=>3

正規表現

日本語の文字列もASCII文字列と同様に扱えます。

# UNICODEのEscapeシーケンス
set code "\u306F"
=>は
# 日本語文字列の置換
regsub {日.} {今日わ良い天気だわ} {日は} var
=>1
puts $var
=>今日は良い天気だわ
# 正規表現で日本語の比較
switch -regexp {にっぽん} {
に?[ほぽ]ん|日本 {puts 日本}
default    {puts 外国}
}
=>日本

font

日本語のフォントを利用できます。
フォントの種類はシステムに依存します。 利用できるフォントを表示する。

font families
=>System @System FixedSys @FixedSys Terminal @Terminal
 {MS Serif} {MS Sans Serif} Courier Symbol {Small Fonts}
 Roman Script Modern 8514oem fixed {HM Phonetic} Marlett
 Arial {Courier New} {Times New Roman} Wingdings Symbol
 {MS 明朝} {MS P明朝} {@MS 明朝} {@MS P明朝} ...

デフォルトのフォントを手っ取り早く設定する方法です。
Windows版のデフォルトは、{{MS Sans Serif} 8}になっています。

option add *Font {{MS 明朝} 10}

encoding

利用できるencodingを表示する。

encoding names
=>cp860 cp861 cp862 cp863 cp864 cp865 cp866 gb12345 cp949 cp950 cp869 dingbats
ksc5601 macCentEuro cp874 macUkraine jis0201 gb2312 euc-cn euc-jp macThai jis0208
iso2022-jp macIceland iso2022 jis0212 cp737 big5 euc-kr macRomania macTurkish
iso2022-kr gb1988 macGreek ascii cp437 macRoman iso8859-1 iso8859-2 iso8859-3
macCroatian koi8-r iso8859-4 cp1250 iso8859-5 cp1251 macCyrillic iso8859-6 cp1252
macDingbats iso8859-7 cp1253 iso8859-8 cp1254 iso8859-9 cp1255 cp850 cp1256 cp932
cp1257 cp852 identity cp1258 macJapan shiftjis utf-8 cp855 cp936 cp775 symbol cp857
unicode

encodingを指定してコード変換をする。

# 日本語EUCコードをUNICODEに変換する。
encoding convertfrom euc-jp "\xA4\xCF"
=>は
# UNICODEを日本語EUCコードに変換する。
encoding convertto euc-jp "\u306F"
=>■

fconfigure

ファイル入出力の際にencodingを指定する。

# 日本語SJISコードのファイルを読み込んで日本語EUCコードのファイルを書き込む
set fd1 [open "foo.txt" r]
set fd2 [open "bar.txt" w]
fconfigure $fd1 -translation crlf -encoding shiftjis
fconfigure $fd2 -translation lf -encoding euc-jp
while {[gets $fd1 line] > 0} {
    puts $fd2 $line
}
close $fd1
close $fd2

format

日本語と英語のメッセージを切り替える。
2つの引数の出現順に注目してください。

# 英語のメッセージ
format "We produced %1\$d units in location %2\$s" $num $city
# 日本語のメッセージ
format "私達は、%2\$s で %1\$d 組のユニットを演出しました。" $num $city

msgcat

メッセージカタログのパッケージを使うと、 各国のメッセージを.msgファイル毎に整理して置くことができ、
それをロケールを指定して取り出すことができます。

# sample.tcl
package require msgcat 1.0
namespace import msgcat::*
msgcat::mcload [file join [file dirname [info script]] msg]
set env(LANG) ja_JP
pack [button .b -text [mc "Push Me"]]
# msg/ja_JP.msg
mcset ja_JP "Push Me" "押してください"

日本語入力

Tcl8.3からtk useinputmethodsコマンドが追加されました。 これは、X上で日本語入力(XIM)を有効にする仕組みですが、 正式には、Tcl8.4でサポートされました。
Windowsの日本語入力(IME)もTcl8.4でサポートされました。