Проблема с Rails utf-8

Я там, я новичок в рубине (и рельсах) и имею проблемы som при использовании шведских букв в строках. В моем действии создайте переменную экземпляра следующим образом:

@title = "Välkommen"

И я получаю следующую ошибку:

invalid multibyte char (US-ASCII)
syntax error, unexpected $end, expecting keyword_end
@title = "Välkommen"
             ^

Что происходит?

EDIT: Если я добавлю:

# coding: utf-8

в верхней части моего контроллера он работает. Почему это и как я могу перенести эту "проблему"?

Ответ 1

См. статью Джоэла Спольского "Абсолютный минимум Каждый разработчик программного обеспечения абсолютно уверен, должен знать о юникодном и символьном наборах (никаких оправданий!)".

Чтобы процитировать часть, которая кратко отвечает на эти вопросы

Самый важный факт о кодировании

Если вы полностью забудете все, что я только что объяснил, пожалуйста, помните один чрезвычайно важный факт. Нет смысла иметь строку не зная, какую кодировку он использует. Вы больше не можете голову в песок и притвориться, что "простой" текст - ASCII.

Вот почему вы должны сказать ruby, какая кодировка используется в вашем файле. Поскольку кодировка не отмечена в каких-либо метаданных, связанных с вашим файлом, некоторое программное обеспечение предполагало ASCII, пока оно не станет лучше. Ruby 1.9, вероятно, делает это до вашего комментария, когда он остановится, и перезапустите чтение файла, теперь декодирующего его как utf-8.

Очевидно, что если вы использовали какую-либо другую кодировку Unicode или некоторую локальную кодировку для своего рубинового файла, вам нужно будет изменить комментарий, чтобы указать правильную кодировку.

Ответ 2

"Магический комментарий" в Ruby 1.9 (на котором основан Rails 3) сообщает интерпретатору, какую кодировку ожидать. Это важно, потому что в Ruby 1.9 каждая строка имеет кодировку. До 1.9 каждая строка представляла собой просто последовательность байтов.

Очень хорошее описание проблемы - в блогах блога Джеймса Грея на Ruby и Unicode. Тот, который точно соответствует вашему вопросу, http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings (но смотрите на другие, потому что они очень хорошие).

Важная строка из статьи:

Первое является основным правилом исходных кодовых кодировок: исходные файлы получают кодировку US-ASCII, если не указано иное.

Ответ 3

Есть несколько мест, которые могут вызвать проблемы с кодировкой utf-8. но некоторые трюки должны решить эту проблему:

  • убедитесь, что каждый файл в вашем проекте основан на utf-8 (если вы используют rad rails, это просто сделать: отметьте свой проект, выберите свойства, в поле "text-file-encoding" выберите "other: UTF-8" )

Обязательно добавьте свои странные символы "å, ä, ö" в свои файлы снова или вы получите ошибку mysql, потому что она изменит ваши "å, ä, ö" на "квадрат" (неизвестный символ)

  • в ваших базах данных .yml для каждой серверной среды (в этом пример "разработка" с mysql)

    development:
       adapter: mysql
       encoding: utf8
    
  • установить в фильтр приложения перед фильтром (Application.rb):

    class ApplicationController < ActionController::Base
     before_filter :set_charset
     def set_charset
      @headers["Content-Type"] = "text/html; charset=utf-8"
     end
    end
    
  • обязательно установите кодировку в utf-8 в вашем mysql (я только использовал mysql.. поэтому я не знаю о других базах данных) для каждой таблицы. если ты используйте mySQL Administrator, вы можете сделать это так: отредактируйте таблицу, нажмите вкладка "таблица параметров", изменить кодировку на "utf8" и сопоставить с "Utf8_general_ci" (Courtsey: kombatsanta)