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

发布于 2025-01-02 04:18:39 字数 666 浏览 2 评论 0原文

我在 Windows 7 上使用 Ruby 1.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()
}

在此处输入图像描述

I'm using Ruby 1.9.3 on Windows 7 with Tk interface. In the following simple example, if i click a button, GUI will return me a "??????" string instead of "привет" displayed. Is it possible to get back actual unicode string entered?

#!/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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初心 2025-01-09 04:18:39

所以我检查了 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.

为了进一步阅读,我建议 此链接,其中介绍了 Ruby 如何看待编码。

So I checked in Windows and got it working. I'd recommend you put this at the top of your file:

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

The # coding bit is unnecessary; the -Ku flag tells Ruby to use the Unicode codepage. While my testing on Mac doesn't seem to have this issue (either appending -Ku or using # coding: utf-8 will work), it is indeed occurring in Windows. I'm running the same versions as you, just in Parallels.

Alternatively, you could delete the shebang part and run the file with ruby -Ku test.rb

Original answer:
Yes, although the solution I'm accustomed to would be using UTF-8. You just have to put # coding: utf-8 on the top line of your file and Ruby will mystically switch over to processing strings in UTF-8:

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

For further reading, I'd suggest this link which goes over how Ruby thinks about encoding.

束缚m 2025-01-09 04:18:39

如果您希望避免 -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"
привет

If you wish to avoid the -Ku 'hack', you must specify the UTF-8 encoding, not just in your own Ruby source file, but also by telling Tk about it, in some way. (Ruby's Tk wrapper has its own source files, of course.)

I slightly modified your program (and noted the changes). Now it works for me on Windows 7, using Ruby 2.2.5 (including 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()
}

On the console, the result I get is:

UTF-8
"\u043F\u0440\u0438\u0432\u0435\u0442"
привет
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文