Мне не удается сохранить данные 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.
Есть (удивительно) четыре места, которые необходимо установить для кодировки UTF-8, чтобы гарантировать, что ваши данные будут сохранены в этом формате в mysql (почему они не используют utf-8, поскольку значение по умолчанию вне меня): Соединение, база данных, таблица и столбцы. Указание utf-8 в вашей базе данных .yml заботится о соединении, остальные три должны быть установлены в mysql (с помощью команд набора символов, сопоставления и набора имен).
Для хорошей меры вам также может потребоваться добавить директиву utf-8 в заголовки html и в вашу среду; чтобы убедиться, что он "берет" по всем направлениям.
Некоторая полезная информация здесь: http://word.wardosworld.com/?p=164
Хотя это уже упоминалось выше:
Ввод encoding: utf8
в database.yml решил это для меня.
Эти проблемы являются симптомами нескольких возможных проблем. В основном ничего общего с Ruby.
1) Ваша форма отправляется с помощью Accept-Charset, отличной от UTF-8. Это произойдет, если
В этом случае браузер может понизить 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%.
Значок вопроса в записи db означает, что он не был правильно обновлен как utf8. Вы должны убедиться, что таблицы и столбцы db имеют настройку utf8 и вы также устанавливаете соединение с utf8. Чтобы убедиться, что вы можете использовать запрос mysql SET NAMES 'UTF-8'.
(Кроме того, мне интересно, почему вы сохраняете всю эту разметку в своем db?)
Чтобы сам Ruby немного разбирался в Unicode, вам нужна эта строка:
$KCODE = 'u'
Я всегда помещаю эту строку в config/environment.rb
И ваша база данных должна быть создана с помощью сортировки utf8, и вы должны иметь кодировку, установленную в UTF8 в database.yml.