Выбор кодировки при записи в файл в Ruby 1.9
16 апреля 2012, обновлена 17 апреля 2012
# 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.
Нет, серьёзно
По делу
А если серьёзно, то эта абстракция полезная и замечательная. Вот только во всех остальных местах при неправильной кодировке возникнет Вот только наличие неявного преобразования кодировки в некоторых местах языка и отсутствие его в других местах не делает Ruby прозрачнее. Какого хрена?EncodingError (например, если конкатенировать Windows-1251 строку с UTF-8 строкой), а тут произойдет неявное преобразование.

Почитай http://blog.grayproductions.net/articles/understanding_m17n. Все вопросы отпадут.
Спасибо, я читал. Мне все равно непонятно, зачем тут неявно приводить кодировку.
Т.е. если ты пишешь в файл 2 строки с разными кодировками – они должны так и записаться? Руби 1.9 как раз хочет, чтобы программист лишний раз не стрелял себе в ноги.
Я хочу EncodingError. :)