Можно ли использовать символы юникода с ruby ​​/ tk? - PullRequest
1 голос
/ 02 февраля 2012

Я использую Ruby 1.9.3 на Windows 7 с интерфейсом Tk. В следующем простом примере, если я нажму кнопку, GUI вернет мне «??????» отображается строка вместо «привет». Можно ли вернуть введенную фактическую строку юникода?

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

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Итак, я проверил в 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.

Для дальнейшего чтения я бы предложил эту ссылку , в которой рассказывается, как Руби думает о кодировании.

0 голосов
/ 24 марта 2019

Если вы хотите избежать «взлома» -Ku, вы должны указать кодировку 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"
привет
...