In Ruby 1.9.2, fand ich eine Möglichkeit, zwei Strings, die die gleichen Bytes, die gleiche Codierung und sind gleich, aber sie haben eine andere length
und verschiedene Zeichen von []
.Warum sind zwei Strings mit gleichen Bytes und Codierung in Ruby 1.9 nicht identisch?
Ist das ein Fehler? Wenn es kein Fehler ist, möchte ich es vollständig verstehen. Welche Art von Informationen werden in Ruby 1.9.2 String-Objekten gespeichert, damit sich diese beiden Strings anders verhalten können?
Unten ist der Code, der dieses Verhalten reproduziert. Die Kommentare, die mit #=>
beginnen, zeigen Ihnen, welche Ausgabe ich von diesem Skript erhalte, und die Klammern in Klammern geben Ihnen mein Urteil über diese Ausgabe.
#!/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!)
Ich benutze Ubuntu und kompilierte Ruby aus der Quelle. Meine Ruby-Version ist:
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
'p string2.bytes.to_a' Ergebnis anzeigen' [194, 162] '?? Das sollte nicht sein! – Zabba
Eigentlich Zabba, das ist das erwartete Ergebnis, weil 194,162 die UTF-8-Codierung des Cent-Zeichens ist (Codepunkt 0xA2). Wenn Sie eine Ganzzahl an concat übergeben, fügt sie Ihrer Zeichenfolge scheinbar ein Zeichen mit diesem Wert hinzu. Sehen Sie diese Tabelle in der Wikipedia aobut UTF-8. Sie verwenden das Cent-Zeichen als Beispiel in der zweiten Zeile: http://en.wikipedia.org/wiki/UTF-8#Description –