Проблемы с кодировкой Yaml после обновления Ruby до 1.9.3 с 1.8.7

Может быть, вы можете помочь с кодировкой Yaml, которая у меня есть.

У нас есть приложение, которое хранит некоторые настройки, сериализованные в базе данных в виде строки Yaml, например:

---
quantity_units: Stunden,Tage, Monate, Pauschal, Jahre, GB, MB, Stück, Seite, SMS
categories: Shirts
number_schema: P-[Y4]-[CY3]

Мы находимся в процессе перехода с Ruby 1.8.7 на Ruby 1.9.3, и библиотека синтаксического анализа Yaml изменилась между версиями, оставив нам такие декодированные строки с Stück на Stück.

Я только хочу знать, как правильно преобразовать эти строки в юникод, а я позабочусь об остальном.

Я не знаю, какая кодировка использовалась в синтаксическом анализаторе Yaml 1.8.7.


person Michał    schedule 23.04.2012    source источник
comment
Какую кодировку вы использовали для чтения файла YAML? А какая кодировка у строки Stück в ruby?   -  person Reactormonk    schedule 23.04.2012
comment
кодировка по умолчанию UTF-8 ruby ​​1.9.3; > "Stück".encoding # => #<Encoding:UTF-8>   -  person Michał    schedule 23.04.2012


Ответы (2)


Похоже, что utf8 читается как iso-8895-1 и интерпретируется как utf-8 адаптером ruby. Возможно, вы захотите проверить текущую локаль и локаль сервера базы данных. Также посмотрите, что произойдет, если вы получите доступ к данным напрямую через консоль, и проверьте кодировку там же. В базе данных он выглядит как utf-8, но интерпретируется как iso-8859-1 где-то посередине.

Если ничего не помогает, есть фрагмент для передачи ваших данных (и записи их обратно).

 "Stück".encode('iso-8859-1').force_encoding('utf-8') # I've no idea what I'm doing.
 # => "Stück"
person Reactormonk    schedule 23.04.2012

Спасибо @Tass, я пишу странный метод вроде твоего "# я понятия не имею, что делаю".

У меня есть приложение в rails 2.3 под ruby ​​1.8, которое совместно использует базу данных Mysql с rails 3.2 и ruby ​​1.9.

На рельсах 2.2 Когда я сохраняю сериализованный массив, иногда я вижу в mysql "binary!" или моя строка в неправильном формате, и поэтому, когда я отображаю текст с помощью rails 3.2, я получаю странное поведение.

Я написал метод для решения этой проблемы (надеюсь, мы перенесем rails 2.3):

def self.decode(words)
  temp_name = words || ''
  temp_name_encoding = temp_name.encoding

  if temp_name_encoding == Encoding::ASCII_8BIT
    return temp_name.encode('ASCII-8BIT').force_encoding('utf-8')
  elsif temp_name_encoding == Encoding::UTF_8
    return temp_name.encode('iso-8859-1').force_encoding('utf-8')
  else
    return temp_name
  end
rescue Encoding::UndefinedConversionError
  temp_name
end
person Hettomei    schedule 07.05.2013