作者: Koichi Yamamoto
日時: 2002/3/13(17:19)
こんにちは、山本です。

たまにデスクトップに大きな時計を表示したくなったとき、
私はすかさずwishを起動して、

pack [label .l -font {Courier 16 {italic bold}}]
proc tm {} {
.l configure -text [clock format [clock seconds]]
after 500 tm
}
tm

などと入力して時計を作ります。
しかし、これをWindows版Tclで実行すると、

Wed Mar 13 16:59:37 ????????? 2002

と、???????部分が文字化けします。
と、いうわけで、早速パッチを作りました。これを適用すると

Wed Mar 13 17:08:32 東京 (標準時) 2002

と、文字化けしなくなります。

diff -r -c -P ./tcl8.3.4/win/tclWinTime.c.orig ./tcl8.3.4/win/tclWinTime.c
*** ./tcl8.3.4/win/tclWinTime.c.orig	Tue Nov 30 16:08:44 1999
--- ./tcl8.3.4/win/tclWinTime.c	Wed Mar 13 16:52:42 2002
***************
*** 33,38 ****
--- 33,39 ----
  
  typedef struct ThreadSpecificData {
      char tzName[64];		/* Time zone name */
+     char tzNameUtf[96];		/* Time zone name (utf) */
      struct tm tm;		/* time information */
  } ThreadSpecificData;
  static Tcl_ThreadDataKey dataKey;
***************
*** 230,237 ****
  	encoding = Tcl_GetEncoding(NULL, "unicode");
  	Tcl_ExternalToUtf(NULL, encoding, 
  		(char *) ((dst) ? tz.DaylightName : tz.StandardName), -1, 
! 		0, NULL, name, sizeof(tsdPtr->tzName), NULL, NULL, NULL);
  	Tcl_FreeEncoding(encoding);
      } 
      return name;
  }
--- 231,240 ----
  	encoding = Tcl_GetEncoding(NULL, "unicode");
  	Tcl_ExternalToUtf(NULL, encoding, 
  		(char *) ((dst) ? tz.DaylightName : tz.StandardName), -1, 
! 		0, NULL, tsdPtr->tzNameUtf, sizeof(tsdPtr->tzNameUtf), NULL, NULL, NULL);
  	Tcl_FreeEncoding(encoding);
+ 	Tcl_UtfToExternal(NULL, NULL, tsdPtr->tzNameUtf, -1, 
+ 		0, NULL, name, sizeof(tsdPtr->tzName), NULL, NULL, NULL);
      } 
      return name;
  }

--
Koichi Yamamoto, 
http://www3.ocn.ne.jp/~yamako/