我在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()
}
所以我检查了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如何考虑编码。
如果你想避免使用-Ku
'hack',你必须指定UTF-8编码,不仅要在你自己的Ruby源文件中,还要以某种方式告诉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"
привет