Бинарные строковые литералы в 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")