在 Ruby 1.9.2 中,我找到了一种方法来生成两个具有相同字节、相同编码且相等的字符串,但它们具有不同的 length
和不同的 []
返回的字符。
这是一个错误吗?如果它不是一个错误,那么我想完全理解它。 Ruby 1.9.2 String 对象中存储了哪些类型的信息,允许这两个字符串的行为不同?
下面是重现此行为的代码。以 #=>
开头的注释向你展示了我从这个脚本中得到了什么输出,括号里的词告诉你我对那个输出的判断。
#!/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]
最佳答案
这是 Ruby 的错误并修复了 r29848 。
关于ruby - 为什么在 Ruby 1.9 中具有相同字节和编码的两个字符串不相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4236793/