Если запускать руби файл из консоли (под виндой), то строка приходит в IBM866 (консоль винды - она такая, с приветом
), и перевод в UTF-8 решает проблему. Подумал, что возможно аптана коряво настроена из коробки, так что пришлось даже ее скачать и поставить и запустить файл уже из под нее. В итоге оказалось, что в Encoding.default_external у нее стоит Windows-1251, что вроде логично. Но на самом же деле, строка в gets приходит уже переведенная в юникод. Строки в руби - это последовательность байтов плюс кодировка. Последовательность байтов приходит как для строки в юникоде, но кодировка стоит неверная.
Есть два решения
Encoding.default_encoding = 'utf-8'
#ИЛИ
s = gets.chop.forse_encoding 'utf-8'