Проблема кодирования данных UTF8 из приложения Rails в Mysql

0

Мне не удается сохранить данные UTF8 в форме и правильно ее сохранить в mysql. В частности, через мое рубиновое приложение я отправляю форму, которая включает в себя следующее:

Gerhard Tröster

В моем терминале я обновляюсь в базе данных следующим образом:

UPDATE `xxxx` SET 
   `updated_at` = '2009-08-13 14:22:33', 
   `description` = '<p><span style=\"font-size: 14px; line-height: normal; white-space: pre; \">Gerhard Tr?ster</span></p>' 
WHERE `id` = 1228

Однако, когда я выбираю из этой таблицы, он говорит:

| description |
---------------
| Gerhard Tr | 

Обратите внимание, что он просто обрезает все после Умлаута, хотя вставка, похоже, включила его (или что-то вроде этого).

У моей базы данных .yml есть кодировка, установленная в UTF8, я также включил соответствующие теги META в свой HTML.

  • 1
    Я не думаю, что это проблема, но что-то смешное происходит с кавычками. Почему вы избегаете двойных кавычек, когда ваши значения разделены одинарными кавычками?
  • 0
    хммм ... это похоже на правку - я думаю, что вопрос мог быть немного искажен в правке Джона Раша.
Показать ещё 1 комментарий
Теги:
utf-8
encoding

5 ответов

2

Есть (удивительно) четыре места, которые необходимо установить для кодировки UTF-8, чтобы гарантировать, что ваши данные будут сохранены в этом формате в mysql (почему они не используют utf-8, поскольку значение по умолчанию вне меня): Соединение, база данных, таблица и столбцы. Указание utf-8 в вашей базе данных .yml заботится о соединении, остальные три должны быть установлены в mysql (с помощью команд набора символов, сопоставления и набора имен).

Для хорошей меры вам также может потребоваться добавить директиву utf-8 в заголовки html и в вашу среду; чтобы убедиться, что он "берет" по всем направлениям.

Некоторая полезная информация здесь: http://word.wardosworld.com/?p=164

1

Хотя это уже упоминалось выше:

Ввод encoding: utf8 в database.yml решил это для меня.

1

Эти проблемы являются симптомами нескольких возможных проблем. В основном ничего общего с Ruby.

1) Ваша форма отправляется с помощью Accept-Charset, отличной от UTF-8. Это произойдет, если

  • страница, отправленная формой, сама по себе не является UTF-8, метатегом или HTTP-заголовком (форма с латинской-1 будет латинской-1)
  • Форма явно указывает, что она отправляется как нечто иное, чем UTF-8
  • Вы используете Javascript для публикации данных и не выполняете их правильно, или ваши пользователи

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

2) Ваш MySQL-сервер настроен таким образом, что он не позволяет вам использовать UTF-8 для хранения данных, поэтому MySQL тихо понижает ваш UTF до чего-то другого (например, MySQL вынужден делать SET NAMES SOME_CRAPPY_8BIT_CHARSET_OF_1990 на каждом соединении, администратор сервера. Нет шутки - это случилось со мной однажды). Прочитайте эту статью, в которой объясняется, как сделать все возможное для UTF-8 со 100-процентной достоверностью http://www.fngtps.com/2007/02/ruby-and-mysql-encoding-flakiness

3) Ваш терминал, который вы смотрите, не показывает вам UTF-8 и пытается перекодировать его на латиницу или ASCII, отбрасывая символы, которые он не может отобразить, и заменить их на "?" (стандартный шаблон). Если вы делаете "puts" ü "" в обычном Ruby с помощью набора $KCODE, что вы видите? Терминалы Windows особенно восприимчивы к такому поведению, прежде чем будут установлены специальные настройки.

4) Вы используете Ruby 1.9, чья обработка Unicode - это особый вопрос вообще

5) Полностью маловероятно, но кто знает: вы используете (или ваш хостер использует) какое-то дерьмовое прокси-решение, которое управляет заголовками кодировок или перекодирует отправленный вход. Я могу поспорить на 2 и 3 с вероятностью 50%.

  • 0
    Спасибо. Я пытался сделать это в том же терминале, на который я ссылался выше: irb (main): 001: 0> "put 'ü'" => "put '\ 303 \ 274'", поэтому он корректно отображается на входе и там вы можете увидеть выход.
1

Значок вопроса в записи db означает, что он не был правильно обновлен как utf8. Вы должны убедиться, что таблицы и столбцы db имеют настройку utf8 и вы также устанавливаете соединение с utf8. Чтобы убедиться, что вы можете использовать запрос mysql SET NAMES 'UTF-8'.

(Кроме того, мне интересно, почему вы сохраняете всю эту разметку в своем db?)

  • 0
    Спасибо. ? Я предположил, был мой терминал, потому что он показывает, что было отправлено в БД. БД просто не содержит ничего после и включая знак вопроса.
  • 0
    +1 для разметки в БД - единственная причина, по которой я понял, что это необходимо, - это когда вы храните пользовательский ввод как форматированный текст
0

Чтобы сам Ruby немного разбирался в Unicode, вам нужна эта строка:

$KCODE = 'u'

Я всегда помещаю эту строку в config/environment.rb

И ваша база данных должна быть создана с помощью сортировки utf8, и вы должны иметь кодировку, установленную в UTF8 в database.yml.

  • 0
    Rails использует UTF-8 / Unicode по умолчанию очень долгое время. Нет необходимости устанавливать $ KCODE.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню