Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在ruby/tk中使用unicode字符吗?_Ruby_Windows_Unicode_Tk - Fatal编程技术网

可以在ruby/tk中使用unicode字符吗?

可以在ruby/tk中使用unicode字符吗?,ruby,windows,unicode,tk,Ruby,Windows,Unicode,Tk,我正在Windows7上使用Ruby1.9.3和Tk接口。在下面的简单示例中,如果我单击一个按钮,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 => 'le

我正在Windows7上使用Ruby1.9.3和Tk接口。在下面的简单示例中,如果我单击一个按钮,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.
#编码
位是不必要的;
-Ku
标志告诉Ruby使用Unicode代码页。虽然我在Mac上的测试似乎没有这个问题(添加
-Ku
或使用
#编码:utf-8
都可以),但它确实发生在Windows中。我运行的版本和你的相同,只是并行

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

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

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

为了进一步阅读,我建议您仔细阅读Ruby是如何考虑编码的。

如果您希望避免使用
-Ku
'hack',您必须指定UTF-8编码,不仅要在您自己的Ruby源文件中,而且要以某种方式告诉Tk。(当然,Ruby的Tk包装器有自己的源文件。)

我稍微修改了你的程序(并注意到了变化)。现在它在Windows 7上运行,使用Ruby 2.2.5(包括Tk 8.5.12):

#/usr/bin/env ruby
#编码:utf-8 vi:et:ts=2
需要“tk”
Tk::Encoding.Encoding=''.Encoding#告诉Tk使用哪种编码(我添加了这一行)。
TkRoot.new.tap{|o|
$edit=TkEntry.new(o).点击{o|
o、 包装(:侧=>“左”)
o、 插入(0,“Пццццц”)
}
新建(o,:text=>“单击我”)。点击{o|
o、 包装(:侧=>“左”)
o、 绑定('1'){
##在这个地方,我想要unicode,但得到了垃圾:(
puts($edit.get().encoding.name)
puts($edit.get().inspect)
puts($edit.get())#查看结果(我添加了这一行)。
}
}
o、 mainloop()
}
在控制台上,我得到的结果是:

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

不幸的是,我的文件已经有了相应的shebang:(。否则,文件中有非ascii文本,即字符串处理不正确。我修改了我的问题以反映这一点。@EyeofHell好的,我刚刚检查了我的Windows安装。Windows Ruby确实对编码比较挑剔,但在文件顶部的
#!/usr/bin/env Ruby-Ku
很容易解决。说明:Tk本身对所有平台上的Unicode都很满意,但Ruby除外必须正确告知源文件的编码,以便理解其中的字符。