2013-04-05 17 views
9

podczas uaktualniania do Ruby 2.0, przypadek testowy rozpoczął się niepowodzeniem:binarne literały ciągów w Ruby 2.0

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

z następującym komunikatem:

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

Zmienna actual zawiera ciąg binarny uzyskanych od zewnętrzne wywołanie biblioteki.

Problem polega na tym, że domyślne kodowanie plików źródłowych (a tym samym literałów napisów): changed in Ruby 2.0 z US-ASCII na UTF-8.

Odpowiedz

20

Rozwiązaniem jest zmiana definicji literału ciągu w celu wymuszenia jego kodowania. Istnieje kilka możliwych opcji, aby to zrobić:

Zastosowanie Array#pack (wszystkie wersje Ruby):

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

Zastosowanie String#b (Ruby> = tylko 2,0):

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

Stosować String#force_encoding (Ruby> = tylko 1.9):

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

W jaki sposób opcja # pack na głowę Cię kliknęła? ta paczka i rozpakowywanie jest dla mnie trudną częścią w rubinie :(jak przetrawić tę wskazówkę? –

+0

@RubyLovely: Wiedziałem już, że pakiet/rozpakowanie istniało dla takich rzeczy, więc przejrzałem dokumentację i wypróbowałem to. zwraca binarny ciąg ma sens, ponieważ jest przeznaczony specjalnie do przetwarzania danych binarnych – robinst

+0

Dzięki za odpowiedź z powrotem –