Ошибка кодирования Rails. HAML проблема, я думаю - PullRequest
1 голос
/ 05 марта 2012

Я на рельсах 3.2.1, использую postgres с pg 0.13.2 и haml 3.1.4. Кодировка БД "unicode", которая, я уверен, такая же, как и "UTF-8" для postgres Метатег имеет charset = utf-8 (как на странице формы, так и на странице отображения), а форма имеет accept-charset = "UTF-8"

Я получаю сообщение об ошибке «несовместимые кодировки символов: ASCII-8BIT и UTF-8» в моей производственной среде (кедр Heroku), и я уже пробовал кучу исправлений, но не совсем понимаю, что происходит , Среда разработки не вызывает проблемы.

Строка, вызывающая проблему, имеет копию апострофа / вставлена ​​из Word. Если я удаляю персонажа, все отрисовывается нормально, но это пользовательский контент, так что в будущем он обязательно сломается.

Из консоли Heroku вызов string.encoding.name возвращает «UTF-8», а использование force_encoding («UTF-8») в представлении не имеет значения.

Но, если я использую фильтр хамла (например, markdown) для строки, все будет хорошо. Кроме того, изменение представления на erb решает проблему.

Есть идеи? Нельзя использовать фильтры повсюду, и я хочу докопаться до сути.

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

tl; dr Переключился на парсер rdiscount и теперь все работает.

Более длинная версия: я до сих пор не совсем уверен, что происходит, но я знаю, что это в синтаксическом анализаторе (гем rpeg-markdown).

Еще один фрагмент текста на рабочей странице содержал странный апостроф в слове, и это казалось проблемой.Если я обернул обе строки в фильтры markdown, то все это заработало, но если ни одного из них не было в фильтре, я получил ошибку кодирования, хотя все это utf-8.

Я переключился на rdiscount, и теперь он работает лиили не один (или оба) из блоков обернуты в фильтр уценки:

0 голосов
/ 06 марта 2012

Вы должны быть уверены, что данные, которые вы получаете из базы данных, установлены в правильной кодировке. Кодировка базы данных может отличаться от кодировки соединения с базой данных, если в файле database.yml не указаны правильные параметры. Например, вам может понадобиться:

development:
  encoding: utf-8

Убедитесь, что значение, полученное через это соединение, закодировано правильно:

my_model.my_attribute.encoding
# => #<Encoding:UTF-8> 

Если у вас есть поле типа BINARY, вы можете получить ASCII-8BIT независимо от настроек. Вы можете попытаться принудительно преобразовать это или вы можете попытаться исправить тип столбца. Принудительное кодирование обычно самое простое:

my_model.my_attribute.force_encoding('UTF-8')

Помните, что force_encoding на самом деле не конвертирует, он просто меняет способ интерпретации строки.

...