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

问题描述 投票:1回答:2

我在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()
}

ruby windows unicode tk
2个回答
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如何考虑编码。


0
投票

如果你想避免使用-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"
привет
© www.soinside.com 2019 - 2024. All rights reserved.