/ / Ruby Marshal.dump dà risultati diversi per quello che sembra la stessa cosa: ruby, serializzazione, marshalling

Ruby Marshal.dump dà risultati diversi per quello che sembra la stessa cosa: ruby, serializzazione, marshalling

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 № 1
Marshal.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).