【发布时间】:2010-11-21 06:58:51
【问题描述】:
在 Ruby 1.9.2 中,我找到了一种方法来制作两个字符串,它们具有相同的字节、相同的编码并且相等,但它们具有不同的 length 和 [] 返回的不同字符。
这是一个错误吗?如果它不是错误,那么我想完全理解它。 Ruby 1.9.2 String 对象中存储了什么样的信息,允许这两个字符串表现不同?
以下是重现此行为的代码。以#=> 开头的 cmets 向您展示了我从该脚本中得到了什么输出,括号中的文字告诉您我对该输出的判断。
#!/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]
【问题讨论】:
-
p string2.bytes.to_a显示结果[194, 162]??那不应该! -
实际上,Zabba,这是预期的结果,因为 194,162 是分字符 ¢(代码点 0xA2)的 UTF-8 编码。显然,如果您将一个整数传递给 concat,它会将一个具有该值的字符添加到您的字符串中。请参阅 Wikipedia aobut UTF-8 中的此表。他们以第二行中的分字符为例:en.wikipedia.org/wiki/UTF-8#Description
标签: ruby string encoding ruby-1.9