为什么Ruby 1.9中具有相同字节和编码的两个字符串不相同?

Dav*_*son 4 ruby string encoding ruby-1.9

在Ruby 1.9.2中,我发现了一种方法,可以使两个字符串具有相同的字节,相同的编码,并且相同,但它们length返回的字符不同且不同[].

这是一个错误吗?如果它不是一个bug,那么我想完全理解它.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!)
Run Code Online (Sandbox Code Playgroud)

我正在运行Ubuntu并从源代码编译Ruby.我的Ruby版本是:

ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
Run Code Online (Sandbox Code Playgroud)

nar*_*use 8

这是Ruby的错误并修复了r29848.