Могу ли я установить строковую кодировку по умолчанию на Ruby 1.9? - PullRequest
17 голосов
/ 19 января 2010

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

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

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 18 октября 2011

Не путайте кодировку файлов со строковым кодированием

Цель оператора #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

6 голосов
/ 17 октября 2011

В вашем config/application.rb добавьте

config.encoding = "utf-8"

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

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

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

3 голосов
/ 19 января 2010

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

Не путайте кодировку файлов и строковую кодировку!

0 голосов
/ 16 октября 2011
String.module_eval "def initialize\nsuper\nputs encoding\nend"
=> nil
irb(main):006:0> String.new
ASCII-8BIT
=> ""

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

...