Не путайте кодировку файлов со строковым кодированием
Цель оператора #encoding
в верхней части файлов - дать знать Ruby во время чтения / интерпретации вашего кода, а вашему редактору -как обрабатывать любые не-ASCII-символы при редактировании / чтении файла - это необходимо, только если в файле есть хотя бы один не-ASCII-символ.например, это необходимо в файлах конфигурации / локали.
Чтобы определить кодировку во всех ваших файлах одновременно , вы можете использовать magic_encoding gem , он может вставить магический комментарий uft-8 ко всем файлам ruby в вашем приложении.
Ошибка, которую вы получаете во время выполнения Encoding::CompatibilityError
- это ошибка, которая возникает, когда вы пытаетесь объединить две строкис другой кодировкой во время выполнения программы, и их кодировки несовместимы.
Это наиболее вероятно происходит, когда:
вы используете строки L10N (например, UTF-8) и объединить их, например, в строку ASCII (на ваш взгляд)
, когда пользователь вводит строку на иностранном языке (например, UTF-8), и ваше представление пытается ее распечататьв некотором представлении, наряду с некоторой фиксированной строкой, которую вы предварительно определили (ASCII).force_encoding
поможет там.В Rails 1.9 также есть Encoding::primary_encoding
для установки кодировки по умолчанию для новых строк. И в Rails есть config.encoding
в файле config / application.rb.
Строки, которые приходят из вашей базы данных, а затем объединяются с другими строками в вашем представлении.(их кодировки могут быть как противоположными, так и несовместимыми).
Примечание: Обязательно укажите кодировку по умолчанию при создании базы данных!
create database yourproject DEFAULT CHARACTER SET utf8;
Если вы хотитечтобы использовать EMOJI в ваших строках:
create database yourproject DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_bin;
и все индексы в строковых столбцах, которые могут содержать EMOJI, должны иметь длину 191 символ.SET CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Причина в том, что обычный UTF8 использует до 3 байтов, тогда как EMOJI использует 4 байта памяти.
Пожалуйста, ознакомьтесь с этой статьей Иегуда Каца , который охватывает это всесторонне, и объясняет это очень хорошо: (в частности, есть раздел «Несовместимые кодировки»)
http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/
http://yehudakatz.com/2010/05/17/encodings-unabridged/
и:
http://zargony.com/2009/07/24/ruby-1-9-and-file-encodings
http://graysoftinc.com/character-encodings