Подтвердить что ты не робот

Могу ли я установить кодировку строки по умолчанию на Ruby 1.9?

Это может звучать незначительно, но это заводило меня с ума. Начиная с выпуска приложения в пятницу в пятницу на Ruby 1.9, у меня было много мелких исключений, связанных с кодировкой символов. Почти все это некоторые вариации:

Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8

У нас есть международная пользовательская база, поэтому многие имена содержат умляуты и т.д. Если я исправлю шаблоны, чтобы использовать force_encoding в кучке мест, он появляется в вспомогательном сообщении флэш-сообщения. Et cetera.

На данный момент похоже, что я прибил все те, о которых я знал, путем исправления конкатенации строк ActiveSupport в одном месте, а затем, установив # encoding: utf-8 в начало каждого из моих исходных файлов. Но ощущение, что мне, возможно, придется помнить, что для каждого файла каждого проекта Ruby, который я когда-либо делал с этого момента, навсегда, просто чтобы избежать проблем с назначением строк, плохо сидит у меня в животе. Я читал о переключателе -Ku, но все, кажется, предупреждает, что он для обратной совместимости и может исчезнуть в любое время.

Итак, мой вопрос для 1.9-опытных людей: устанавливает #encoding в каждом из моих файлов, действительно необходимых? Есть ли разумный способ сделать это глобально? Или, лучше, способ установить кодировку по умолчанию для нелиберальных значений строк, которые обходят внутренние/внешние значения по умолчанию?

Заранее благодарим за любые предложения.

4b9b3361

Ответ 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/

и

http://zargony.com/2009/07/24/ruby-1-9-and-file-encodings

http://graysoftinc.com/character-encodings

Ответ 2

В config/application.rb добавить

config.encoding = "utf-8"

и выше строки Application.initialize! в config/environment.rb, добавьте следующие две строки:

Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8

Надеюсь, что это поможет.

Ответ 4

String.module_eval "def initialize\nsuper\nputs encoding\nend"
=> nil
irb(main):006:0> String.new
ASCII-8BIT
=> ""

Не знаете, как реализовать свои строки в вашей системе, но, подключившись к методу инициализации объекта String, вы можете установить кодировку для любых строк, которые вы создаете во всем приложении.