Выбор кодировки при записи в файл в Ruby 1.9

April 16, 2012, revised April 17, 2012 Ruby Ruby 1.9 UTF-8 Windows-1251 кодировка
# coding: utf-8
foo = 'тест'.encode('windows-1251')
puts foo.encoding # windows-1251
puts foo # "\xF2\xE5\xF1\xF2"
File.open('foo.txt', 'w') {|f| f.write(foo) }

Угадай, что будет в foo.txt? Строка “тест” в кодировке UTF-8!

Оказывается, Ruby 1.9 магическим образом при записи в файл перекодировывает строки в кодировку по умолчанию.

Чтоб записать в файл данные в Windows-1251, нужно указать эту кодировку при открытии файла:

foo = 'тест'
File.open('foo.txt', 'w:windows-1251') {|f| f.write(foo) }

А так в файл будет записана строка в CP1251.


Нет, серьёзно

По делу

А если серьёзно, то эта абстракция полезная и замечательная. –Вот только во всех остальных местах при неправильной кодировке возникнет EncodingError (например, если конкатенировать Windows-1251 строку с UTF-8 строкой), а тут произойдет неявное преобразование.– Вот только наличие неявного преобразования кодировки в некоторых местах языка и отсутствие его в других местах не делает Ruby прозрачнее. Какого хрена?

Buy Me a Coffee at ko-fi.com