В Ruby 1.9.2 я нашел способ создать две строки, которые имеют одинаковые байты, одинаковую кодировку и равны, но имеют разные length
и разные символы, возвращаемые []
.
Это ошибка? Если это не ошибка, то я хотел бы полностью понять это. Какая информация хранится в Ruby 1.9.2 Строковых объектах, которые позволяют этим двум строкам вести себя по-разному?
Ниже приведен код, который воспроизводит это поведение. Комментарии, начинающиеся с #=>
, показывают, какой вывод я получаю из этого сценария, а слова в скобках говорят о моем суждении об этом выводе.
#!/usr/bin/ruby1.9
# coding: utf-8
string1 = "\xC2\xA2" # A well-behaved string with one character (¢)
string2 = "".concat(0xA2) # A bizarre string very similar to string1.
p string1.bytes.to_a #=> [194, 162] (good)
p string2.bytes.to_a #=> [194, 162] (good)
puts string1.encoding.name #=> UTF-8 (good)
puts string2.encoding.name #=> UTF-8 (good)
puts string1 == string2 #=> true (good)
puts string1.length #=> 1 (good)
puts string2.length #=> 2 (weird!)
p string1[0] #=> "¢" (good)
p string2[0] #=> "\xC2" (weird!)
Я использую Ubuntu и скомпилировал Ruby из исходного кода. Моя версия Ruby:
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]