Ответ 1
Не путайте кодировку файлов со строковым кодированием
Цель оператора #encoding
в верхней части файлов - сообщить Ruby во время чтения/интерпретации вашего кода, а ваш редактор знает, как обрабатывать любые символы, отличные от ASCII, при редактировании/чтении файла - это необходимо только в том случае, если в файле имеется хотя бы один символ, отличный от ASCII. например это необходимо в ваших файлах config/locale.
Чтобы определить кодировку во всех ваших файлах одновременно, вы можете использовать magic_encoding gem, он может вставлять магический комментарий uft-8 во все рубиновые файлы в вашем приложении.
Ошибка, которую вы получаете во время выполнения Encoding::CompatibilityError
, является ошибкой, которая возникает, когда вы пытаетесь объединить две строки с различным кодированием во время выполнения программы, а их кодировки несовместимы.
Это наиболее вероятно, когда:
-
вы используете строки L10N (например, UTF-8) и объединяете их, например. Строка ASCII (на ваш взгляд)
-
пользователь вводит строку в чужом языке (например, UTF-8), и ваше представление пытается распечатать его в некотором представлении вместе с некоторой фиксированной строкой, которую вы предварительно определили (ASCII).
force_encoding
поможет. Там такжеEncoding::primary_encoding
в Rails 1.9 для установки кодировки по умолчанию для новых строк. И есть файлconfig.encoding
в Rails в файле config/application.rb. -
Строка, которая поступает из вашей базы данных, а затем объединяется с другими строками в вашем представлении. (их кодировки могут быть как в порядке, так и несовместимы).
Боковое примечание: Обязательно укажите кодировку по умолчанию при создании своей базы данных!
create database yourproject DEFAULT CHARACTER SET utf8;
Если вы хотите использовать EMOJI в своих строках:
create database yourproject DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_bin;
и все индексы в строковых столбцах, которые могут содержать EMOJI, должны иметь длину 191 символ. CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Причиной этого является то, что обычный UTF8 использует до 3 байтов, тогда как EMOJI использует 4 байта хранения.
Пожалуйста, проверьте эту статью Yehuda Katz, которая охватывает эту глубину и объясняет ее очень хорошо: (в частности, есть раздел "Несовместимые кодировки" )
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/
и