是否可以使用ruby / tk的unicode字符?

时间:2012-02-02 12:53:10

标签: ruby windows unicode tk

我在Windows 7上使用带有Tk界面的Ruby 1.9.3。在下面的简单示例中,如果我单击一个按钮,GUI将返回“??????”显示字符串而不是“привет”。是否可以取回输入的实际unicode字符串?

#!/usr/bin/env ruby
# coding:utf-8 vi:et:ts=2
require 'tk'
TkRoot.new.tap { |o|
  $edit = TkEntry.new( o ).tap { |o|
    o.pack( :side => 'left' )
    o.insert( 0, "привет" )
  }
  TkButton.new( o, :text => "click me" ).tap { |o|
    o.pack( :side => 'left' )
    o.bind( '1' ) {
      ##  In this place i want unicode, but got garbage :(
      puts( $edit.get().encoding.name )
      puts( $edit.get().inspect )
    }
  }
  o.mainloop()
}

enter image description here

2 个答案:

答案 0 :(得分:2)

所以我检查了Windows并使其正常工作。我建议你把它放在文件的顶部:

#!/usr/bin/env ruby -Ku
require 'tk'
# etc.

# coding位是不必要的; -Ku标志告诉Ruby使用Unicode代码页。虽然我在Mac上的测试似乎没有这个问题(附加-Ku或使用# coding: utf-8会起作用),但它确实发生在Windows中。我正在使用与Parallels相同的版本。

或者,您可以删除shebang部分并使用ruby -Ku test.rb

运行该文件

原始答案:
是的,虽然我习惯使用的解决方案是使用UTF-8。您只需将# coding: utf-8放在文件的顶行,Ruby将神秘切换到UTF-8中的处理字符串:

# coding: utf-8
require 'tk'
TkRoot.new.tap { |o|
# etc.

为了进一步阅读,我建议this link讨论Ruby如何考虑编码。

答案 1 :(得分:0)

如果您想避免-Ku'hack',则必须不仅在您自己的Ruby源文件中指定UTF-8编码,而且还应通过某种方式将其告知Tk。 (当然,Ruby的Tk包装器有其自己的源文件。)

我稍微修改了您的程序(并记录了更改)。现在它可以在Windows 7上使用Ruby 2.2.5(包括Tk 8.5.12)在我身上运行:

#!/usr/bin/env ruby
# coding:utf-8 vi:et:ts=2
require 'tk'
Tk::Encoding.encoding = ''.encoding  # Tell Tk which encoding to use (I added this line).
TkRoot.new.tap { |o|
  $edit = TkEntry.new( o ).tap { |o|
    o.pack( :side => 'left' )
    o.insert( 0, "привет" )
  }
  TkButton.new( o, :text => "click me" ).tap { |o|
    o.pack( :side => 'left' )
    o.bind( '1' ) {
      ##  In this place i want unicode, but got garbage :(
      puts( $edit.get().encoding.name )
      puts( $edit.get().inspect )
      puts( $edit.get() )  # See the result (I added this line).
    }
  }
  o.mainloop()
}

在控制台上,我得到的结果是:

UTF-8
"\u043F\u0440\u0438\u0432\u0435\u0442"
привет