Частично проблема в том, что в Ruby 1.8.7 появилась поддержка нескольких байтов. Возможно, вам нужно определить значение $ KCODE для вашего источника. См. Переменная $ KCODE и библиотека jcode
Ruby 1.9.2 имеет гораздо лучшую поддержку, поэтому попробуйте, если это возможно.
Это от возни с 1.9.2 и irb:
Greg:~ greg$ irb -f
irb(main):001:0> RUBY_VERSION
=> "1.9.2"
irb(main):002:0> str = "调试程序"
=> "调试程序"
irb(main):003:0> str
=> "调试程序"
irb(main):004:0> str.each_char.to_a
=> ["调", "试", "程", "序"]
irb(main):005:0> str.each_byte.to_a
=> [232, 176, 131, 232, 175, 149, 231, 168, 139, 229, 186, 143]
irb(main):006:0> str.valid_encoding?
=> true
irb(main):007:0> str.codepoints
=> #<Enumerator: "调试程序":codepoints>
irb(main):008:0> str.each_codepoint.to_a
=> [35843, 35797, 31243, 24207]
irb(main):009:0> str.each_codepoint.to_a.map { |i| i.to_s(16) }
=> ["8c03", "8bd5", "7a0b", "5e8f"]
irb(main):010:0> str.encoding
=> #<Encoding:UTF-8>
irb(main):011:0>
И, если я запускаю следующее в Textmate, в то время как 1.9.2 по умолчанию:
# encoding: UTF-8
puts RUBY_VERSION
str = "调试程序"
puts str
который выводит:
# >> 1.9.2
# >> 调试程序
Ruby Debug19 злится на тот же код, поэтому мне нужно разобраться в чем его проблема.