Vedo risultati leggermente diversi con quelli di Ruby Marshal.dump
a seconda se ho chiamato .to_s
su qualcosa o ho digitato i caratteri. Non sono davvero chiaro su cosa sta succedendo qui:
» Marshal.dump(1.to_s)
=> "x04bI"x061x06:x06EF"
» Marshal.dump("1")
=> "x04bI"x061x06:x06ET"
» 1.to_s == "1"
=> true
Quindi anche se sembra questo 1.to_s == "1"
non escono allo stesso modo, ma l'unica differenza è nell'ultimo byte: ogni idea del perché questo sta accadendo e come posso ottenere che entrambe le cose vengano scaricate nella stessa sequenza di byte?
risposte:
3 per risposta № 1Marshal.load("x04bI"x061x06:x06EF").encoding
# => #<Encoding:US-ASCII>
Marshal.load("x04bI"x061x06:x06ET").encoding
# => #<Encoding:utf-8>
Di default, 1.to_s.encoding
non è lo stesso di "1".encoding
. Tuttavia, entrambe le stringhe sono nell'intervallo ASCII a 7 bit, quindi sono paragonabili e "1" == 1.to_s
sarà in grado di darti il risultato true
, dopo una certa magia interiore. Ma non sono la stessa cosa
Marshal.dump(1.to_s.force_encoding("utf-8"))
# => "x04bI"x061x06:x06ET"
Marshal.dump("1")
# => "x04bI"x061x06:x06ET"
(Supponendo di eseguirlo su un nuovo Ruby e non si scherza con la codifica sorgente).