2013-04-05 10 views
9

Quando l'aggiornamento a Ruby 2.0, un banco di prova hanno cominciato a fallire:binari stringhe in Ruby 2.0

expected = "\xD1\x9B\x86" 
assert_equal expected, actual 

con il seguente messaggio:

<"ћ\x86"> expected but was 
<"\xD1\x9B\x86">. 

La variabile actual contiene una stringa binaria ottenuta da una chiamata alla libreria esterna.

Il problema è che la codifica predefinita dei file di origine (e quindi delle stringhe letterali) changed in Ruby 2.0 da US-ASCII a UTF-8.

risposta

20

La soluzione è modificare la definizione della stringa letterale per imporre la sua codifica. Ci sono alcune possibili opzioni per farlo:

Usa Array#pack (tutte le versioni di Ruby):

expected = ["d19b86"].pack('H*') 

Usa String#b (Rubino> = 2.0):

expected = "\xD1\x9B\x86".b 

Utilizzare String#force_encoding (Ruby> = 1.9 solo):

expected = "\xD1\x9B\x86".force_encoding("ASCII-8BIT") 
+0

Come l'opzione # pacchetto array ha fatto clic sulla tua testa? questo pack & unpack è la parte difficile per me nel ruby ​​:(come digerire che qualsiasi indizio? –

+0

@RubyLovely: sapevo già che il pack/unpack esisteva per cose come questa, quindi ho cercato la documentazione e l'ho provata. restituisce una stringa binaria ha senso, in quanto è progettato specificamente per elaborare dati binari – robinst

+0

Grazie per la risposta indietro! –

Problemi correlati