Все строки Ruby 1.9 имеют прикрепленную кодировку.
YAML кодирует некоторые строки не-UTF8 как двоичные, даже если они выглядят невинно, без каких-либо старших битовых символов. Вы можете подумать, что ваш код всегда использует UTF8, но встроенные функции могут возвращать строки не-UTF8 (например, процедуры пути к файлу).
Чтобы избежать двоичного кодирования, убедитесь, что все ваши строковые кодировки имеют UTF-8, прежде чем вызывать to_yaml. Измените кодировку методом force_encoding ("UTF-8").
Например, вот как я кодирую хэш опций в yaml:
options = {
:port => 26000,
:rackup => File.expand_path(File.join(File.dirname(__FILE__), "../sveg.rb"))
}
utf8_options = {}
options.each_pair { |k,v| utf8_options[k] = ((v.is_a? String) ? v.force_encoding("UTF-8") : v)}
puts utf8_options.to_yaml
Вот пример yaml, кодирующего простые строки в двоичном виде
>> x = "test"
=> "test"
>> x.encoding
=> #<Encoding:UTF-8>
>> x.to_yaml
=> "--- test\n...\n"
>> x.force_encoding "ASCII-8BIT"
=> "test"
>> x.to_yaml
=> "--- !binary |-\n dGVzdA==\n"