我在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()
}
答案 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"
привет