Выбор кодировки при записи в файл в 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.

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

По делу

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



Четыре комментария. Напиши еще один
  1. 4724cb48d8268107b255b295ff81d115 # 18 апреля 2012 fxposter (blog.fxposter.org) написал:

    Почитай http://blog.grayproductions.net/articles/understanding_m17n. Все вопросы отпадут.

    1. 777894ea5153122bfa6b83f5bbf23622 # 18 апреля 2012 Леонид Шевцов (автор) написал:

      Спасибо, я читал. Мне все равно непонятно, зачем тут неявно приводить кодировку.

      1. 4724cb48d8268107b255b295ff81d115 # 18 апреля 2012 fxposter (blog.fxposter.org) написал:

        Т.е. если ты пишешь в файл 2 строки с разными кодировками – они должны так и записаться? Руби 1.9 как раз хочет, чтобы программист лишний раз не стрелял себе в ноги.

        1. 777894ea5153122bfa6b83f5bbf23622 # 18 апреля 2012 Леонид Шевцов (автор) написал:

          Я хочу EncodingError. :)

(нужна разметка?)

  • **жирный**
  • > цитата

отменить