# Bug with Ruby/Tk encoding (ruby-1.9.1-rc1)

**URL:** <https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997>\
**Category:** Ruby\
**Created:** [January 6, 2009, 10:41am UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997 "2009-01-06T10:41:17Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![mdiam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@mdiam](https://www.ruby-forum.com/u/mdiam)\
**Post date:** [January 6, 2009, 10:41am UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997/1 "2009-01-06T10:41:17Z")

</div>

Bonjour à tous,

I have a script starting like this :

#!/usr/bin/env ruby

# encoding: iso8859-1

When I lauch it, the following error occurs:

…/ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb:3028:in `find': unknown encoding name - (ArgumentError) from /.../ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb:3028:in`\<top (required)

> ’  
> from ./gotic:1565:in `require' from ./gotic:1565:in`test\_tk’  
> …

The test\_tk top method is the following:

def test\_tk  
require ‘tk’  
root = TkRoot.new { title “Test de Tk sous Ruby” }  
TkLabel.new(root) {  
text ‘Essai de Ruby/Tk !’  
pack { padx 15 ; pady 15; side ‘left’ }  
}  
TkButton.new(root) {  
text ‘Quitter’  
pack { padx 15 ; pady 15; side ‘bottom’ }  
command ‘exit’  
}  
Tk.mainloop  
end #def test\_tk

Also, is there any online doc on all the encoding feature from  
ruby-1.9.1???  
For sample, can we specifiy anywhere in the toplevel pplication file  
(and not in \*_all_ file  
the encoding?

Thank you very much.  
– Maurice

---

<div class="post-metadata">

**Author:** ![mdiam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@mdiam](https://www.ruby-forum.com/u/mdiam)\
**Post date:** [January 7, 2009, 5:40am UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997/2 "2009-01-07T05:40:03Z")

</div>

From: mdiam [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Bug with Ruby/Tk encoding (ruby-1.9.1-rc1)  
Date: Tue, 6 Jan 2009 18:15:01 +0900  
Message-ID:  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> I have a script starting like this :
> 
> #!/usr/bin/env ruby
> 
> # encoding: iso8859-1
> 
> When I lauch it, the following error occurs:

I can’t regenerate the error.

> …/ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb:3028:in `find': unknown encoding name - (ArgumentError) from /.../ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb:3028:in `\<top (required)\>’

Probably, the error occurs on Encoding.find(),  
but tk.rb:3028 doesn’t include the method.  
On my archive, tk.rb:3028 is a comment line.

## Please check your ‘…/ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb’ file. tk.rb included ruby-1.9.1-rc1 has the following line (line:5553).

## RELEASE\_DATE = ‘2008-12-21’.freeze

> Also, is there any online doc on all the encoding feature from  
> ruby-1.9.1???

Not all, but about Ruby/Tk, its default rules are the followings.

- Use Encoding.default\_external for terminal outputs of Tcl/Tk  
libraries.  
It can be referd/changed with Tk.encoding\_system/encoding\_system=.

- Use Encoding.default\_internal for strings passed from Tcl/Tk libraries  
to Ruby. It can be referd/changed with Tk.encoding/encoding=. However,  
if the constant DEFAULT\_TK\_ENCODING is defined before ‘require “tk”’,  
Ruby/Tk use it instead of Encoding.default\_internal.  
If DEFAULT\_TK\_ENCODING is not defined and Encoding.default\_internal  
is nil, use Encoding.default\_external.

It may be better that Ruby/Tk returns strings by caller’s script  
encoding.  
But, if I’m right, libraries (e.g. tk.rb) can’t know caller’s script  
encoding (at least, by low cost).  
So, Ruby/Tk supports the global status (Tk.encoding) only.

## Well, you can get current script encoding by **ENCODING**. If you want to use it for Ruby/Tk, for example,

DEFAULT\_TK\_ENCODING = **ENCODING**  
require ‘tk’

---

<div class="post-metadata">

**Author:** ![mdiam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@mdiam](https://www.ruby-forum.com/u/mdiam)\
**Post date:** [January 8, 2009, 9:33am UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997/3 "2009-01-08T09:33:54Z")

</div>

From: mdiam [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: Bug with Ruby/Tk encoding (ruby-1.9.1-rc1)  
Date: Thu, 8 Jan 2009 17:09:54 +0900  
Message-ID:  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> Your are right, I had inserted some comments for debugging  
> (without success).

I see.

> /home/…/ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb:3022:in `find’:  
> unknown encoding name - (ArgumentError)

## The line is

## loc\_enc\_obj = ::Encoding.find(::Encoding.locale\_charmap)

It means that “Encoding.locale\_charmap” returns an empty string.  
Though I believed that this line gets current locale information,  
it may be wrong.  
I’ll ask M17N maintainers about Encoding.locale\_charmap.  
Please give me a few days.

---

<div class="post-metadata">

**Author:** ![mdiam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@mdiam](https://www.ruby-forum.com/u/mdiam)\
**Post date:** [January 9, 2009, 6:13am UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997/4 "2009-01-09T06:13:38Z")

</div>

From: Hidetoshi NAGAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: Bug with Ruby/Tk encoding (ruby-1.9.1-rc1)  
Date: Thu, 8 Jan 2009 17:32:56 +0900  
Message-ID: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> It means that “Encoding.locale\_charmap” returns an empty string.

## It may be abnormal. However, Ruby/Tk will rescue it. Please try the following patch.

# Index: ext/tk/lib/tk.rb

— ext/tk/lib/tk.rb (revision 21405)  
+++ ext/tk/lib/tk.rb (working copy)  
@@ -3019,7 +3019,7 @@  
end

else ### Ruby 1.9 !!!

- loc\_enc\_obj = ::Encoding.find(::Encoding.locale\_charmap)

- loc\_enc\_obj = (::Encoding.find(::Encoding.locale\_charmap) rescue  
Tk::Encoding::UNKNOWN)  
ext\_enc\_obj = ::Encoding.default\_external  
int\_enc\_obj = ::Encoding.default\_internal || ext\_enc\_obj  
tksys\_enc\_name =  
Tk::Encoding::ENCODING\_TABLE.get\_name(Tk.encoding\_system)  
@@ -5550,7 +5550,7 @@  
#Tk.freeze

module Tk

- RELEASE\_DATE = ‘2008-12-21’.freeze

- RELEASE\_DATE = ‘2009-01-09’.freeze

---

<div class="post-metadata">

**Author:** ![mdiam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@mdiam](https://www.ruby-forum.com/u/mdiam)\
**Post date:** [January 8, 2009, 9:10am UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997/5 "2009-01-08T09:10:58Z")

</div>

On 7 jan, 05:08, Hidetoshi NAGAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On my archive, tk.rb:3028 is a comment line.
> 
> ## Please check your ‘…/ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb’ file. tk.rb included ruby-1.9.1-rc1 has the following line (line:5553).
> 
> ## RELEASE\_DATE = ‘2008-12-21’.freeze

Your are right, I had inserted some comments for debugging  
(without success).  
So I have the same version as yours (standard ruby-1.9.1-rc1)

The problem occurs while calling the require “tk”.  
So the Tk.encoding cannot be used.

Here is a minimalist full sample

#!/usr/bin/env ruby

# encoding: iso8859-1 # because of the puts “éléphant”

# 

puts “Encoding.default\_external=#{Encoding.default\_external}”  
puts “Encoding.default\_internal=#{Encoding.default\_internal}”  
puts “Encoding. **ENCODING** =#{ **ENCODING** }”

Encoding.default\_external=“iso-8859-15”  
Encoding.default\_internal=“iso-8859-15”

puts “Encoding.default\_external=#{Encoding.default\_external}”  
puts “Encoding.default\_internal=#{Encoding.default\_internal}”  
puts “Encoding. **ENCODING** =#{ **ENCODING** }”

puts “Bonjour l’éléphant !”

# Simple création d’un bouton avec “quitter” comme action

DEFAULT\_TK\_ENCODING= **ENCODING**  
def tktest  
require ‘tk’  
root = TkRoot.new { title “Test de Tk sous Ruby” }  
TkLabel.new(root) {  
text ‘Essai de Ruby/Tk !’  
pack { padx 15 ; pady 15; side ‘left’ }  
}  
TkButton.new(root) {  
text ‘Quitter’  
pack { padx 15 ; pady 15; side ‘bottom’ }  
command ‘exit’  
}  
Tk.mainloop  
end  
tktest

And here are the full result:

ruby -version  
ruby 1.9.1 (2008-12-30 patchlevel-0 revision 21203) [powerpc-  
darwin9.6.0]

./tktest.rb  
Encoding.default\_external=ASCII-8BIT  
Encoding.default\_internal=  
Encoding. **ENCODING** =ISO-8859-1  
Encoding.default\_external=ISO-8859-15  
Encoding.default\_internal=ISO-8859-15  
Encoding. **ENCODING** =ISO-8859-1  
Bonjour l’éléphant !  
/home/…/ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb:3022:in `find': unknown encoding name - (ArgumentError) from /home/.../ruby-1.9.1-rc1/lib/ruby/1.9.1/tk.rb:3022: in `\<top (required)\>’  
from ./tktest.rb:19:in `require' from ./tktest.rb:19:in `tktest’  
from ./tktest.rb:33:in `’

(the standard Tk window appears just before the error)

– Maurice Diamantini at [ensta.fr](http://ensta.fr)

---

<div class="post-metadata">

**Author:** ![mdiam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@mdiam](https://www.ruby-forum.com/u/mdiam)\
**Post date:** [January 9, 2009, 5:11pm UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997/6 "2009-01-09T17:11:04Z")

</div>

comp.lang.ruby  
removed\_email\_address@domain.invalid

On Jan 9, 6:12 am, Hidetoshi NAGAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> From: Hidetoshi NAGAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> Subject: Re: Bug with Ruby/Tk encoding (ruby-1.9.1-rc1)  
> Date: Thu, 8 Jan 2009 17:32:56 +0900  
> Message-ID: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
> 
> > It means that “Encoding.locale\_charmap” returns an empty string.
> 
> It may be abnormal. However, Ruby/Tk will rescue it.  
> Please try the following patch.  
> …

I’ve done the following (manually):

```
# loc_enc_obj = ::Encoding.find(::Encoding.locale_charmap)
loc_enc_obj = (::Encoding.find(::Encoding.locale_charmap) rescue

```

Tk::Encoding::UNKNOWN)

Now, the  
require “tk”  
works: the Tk main window appears and is start to resize (like the  
expected button size).  
So the encoding problem seems solved: \*\*\* thank you very much  
Hidetoshi!! \*\*\* …

…but I don’t see any button and the Tk windows blocks.

Perhaps, it’s a problem with bad version of tk, or a bad compil  
options:  
irb  
require “tk”  
=\> true  
irb(main):007:0\* Tk.info :lib  
=\> “/System/Library/Frameworks/Tcl.framework/Versions/8.4/Resources/  
Scripts”

But I remember I tried to compile ruby with a personnal tcl/tk version  
(8.5.5 with x11)  
in a specific location, which don’t seems used at runtime.

So, is there a mean to tell Ruby (at runtime) to use a particular tcl/  
tk version (something witch could be name “RUBY\_TCLTK\_LIB”)?

Or better question:  
This problem arise because ruby doesn’t integrate tk in itself.  
So is there a mean to tell ruby at compile time:  
“I want to use **that** tcl/tk sources, and  
compile it as a special tcltklib version  
with all specific options you need for  
it to work with ruby!”

I know this will make a “big” ruby distribution, but it will be much  
(MUCH) easier  
to install and to maintain !  
I think that such a compil option would help people make a robust ruby/  
tk  
comparable to (ideally) the tcl/tk version

– Maurice

---

<div class="post-metadata">

**Author:** ![mdiam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@mdiam](https://www.ruby-forum.com/u/mdiam)\
**Post date:** [January 12, 2009, 6:31pm UTC](https://www.ruby-forum.com/t/bug-with-ruby-tk-encoding-ruby-1-9-1-rc1/156997/7 "2009-01-12T18:31:08Z")

</div>

From: mdiam [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: Bug with Ruby/Tk encoding (ruby-1.9.1-rc1)  
Date: Sat, 10 Jan 2009 01:10:09 +0900  
Message-ID:  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> So, is there a mean to tell Ruby (at runtime) to use a particular tcl/  
> tk version (something witch could be name “RUBY\_TCLTK\_LIB”)?

Please use Tk::TK\_PATCHLEVEL

> Or better question:  
> This problem arise because ruby doesn’t integrate tk in itself.  
> So is there a mean to tell ruby at compile time:  
> “I want to use **that** tcl/tk sources, and  
> compile it as a special tcltklib version  
> with all specific options you need for  
> it to work with ruby!”

Please read “/ext/tk/README.tcltklib” about configure options.
