Бинарные строковые литералы в Ruby 2.0

При обновлении до Ruby 2.0 тест завершился неудачей:

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

со следующим сообщением:

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

Переменная actual содержит двоичную строку, полученную из внешнего вызова библиотеки.

Проблема в том, что стандартная кодировка исходных файлов (и, следовательно, строковых литералов) изменена в Ruby 2.0 от US-ASCII до UTF-8.

Ответ 1

Решение состоит в том, чтобы изменить определение строкового литерала для обеспечения его кодировки. Существует несколько возможных вариантов:

Используйте Array # pack (все версии Ruby):

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

Используйте String # b (только Ruby >= 2.0):

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

Используйте String # force_encoding (только Ruby >= 1,9):

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