立石@JAISTです。

TclTkLibでTcl8.1のEncodingを行なえるよう
にできました。
Tcl8.1をお使いの方は試してみて下さい。

;; 以前できなかったのは初歩的なミスでした、、、、(^^;

以下のように使います。

require "tcltklib"
ip = TclTkIp.new
cmd1 = ip._encoding("button .b -text 終了","euc-jp")
cmd2 = "pack .b"
ip._eval(cmd1)
ip._eval(cmd2)
TclTkLib.mainloop

以下パッチです。


*** tcltklib.c.old	Tue Jul  7 13:01:56 1998
--- tcltklib.c	Sat Jul 11 08:30:31 1998
***************
*** 243,248 ****
--- 243,274 ----
  }
  
  static VALUE
+ ip_encoding(VALUE self, VALUE str, VALUE encodename)
+ {
+   Tcl_Interp *interp;
+   Tcl_Encoding encoding;
+   Tcl_DString dstr;
+   struct tcltkip *ptr;
+   char buff1[1024],buff2[1024];
+ 
+   Data_Get_Struct(self,struct tcltkip, ptr);
+   interp = ptr->ip;
+ 
+   encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename));
+   strcpy(buff1,STR2CSTR(str));
+ 
+   Tcl_DStringInit(&dstr);
+   Tcl_DStringFree(&dstr);
+   Tcl_ExternalToUtfDString(encoding,buff1,strlen(buff1),&dstr);
+   strcpy(buff2,Tcl_DStringValue(&dstr));
+ 
+   Tcl_FreeEncoding(encoding);
+   Tcl_DStringFree(&dstr);
+ 
+   return str_new2(buff2);
+ };
+ 
+ static VALUE
  ip_invoke(int argc, VALUE *argv, VALUE obj)
  {
      struct tcltkip *ptr;	/* tcltkip data struct */
***************
*** 356,361 ****
--- 382,388 ----
  
      rb_define_singleton_method(ip, "new", ip_new, 0);
      rb_define_method(ip, "_eval", ip_eval, 1);
+     rb_define_method(ip, "_encoding",ip_encoding,2);
      rb_define_method(ip, "_invoke", ip_invoke, -1);
      rb_define_method(ip, "_return_value", ip_retval, 0);
      rb_define_method(ip, "mainloop", lib_mainloop, 0);