Rails усекает строки UTF-8, содержащие & eacute; (например)

Я работаю над приложением rails 3.1 с ruby 1.9.3 и mongoid в качестве моего ORM. Я сталкиваюсь с раздражающей проблемой. Я хотел бы обрезать содержание сообщения, как это:

<%= raw truncate(strip_tags(post.content), :length => 200) %>

я использую raw а также strip_tags потому что мой post.content на самом деле обрабатывается с помощью текстового редактора.

У меня серьезная проблема с не ASCII символами. Представьте, что мой пост содержит следующее:

éééé éééé éééé éééé éééé éééé éééé éééé

То, что я делаю выше наивным способом, делает это:

éééé éééé éééé éééé éééé &eac... 

Похоже, усечение видит каждое слово строки как &eacute;&eactute;&eacute;&eacute;,

Есть ли способ либо:

  1. Обрезать ли обработчик фактические строки UTF-8, где "é" обозначает один символ? Это был бы мой любимый подход.
  2. Взломайте приведенную выше инструкцию так, чтобы результат был лучше, например, заставьте рельсы усекаться между двумя словами,

Я задаю этот вопрос, потому что я не нашел никакого решения до сих пор. Это единственное место в моем приложении, где у меня есть проблемы с таким персонажем, и это серьезная проблема, так как весь контент сайта на французском языке, поэтому содержит много é, ç, à, ù,

Кроме того, я думаю, что это поведение весьма неудачно для truncate помощник, потому что в моем случае он вообще не усекает 200 символов, а примерно 25 символов!

4 ответа

Решение

Возможно, слишком поздно, чтобы помочь с вашей проблемой, но... Вы можете использовать лимитный метод ActiveSupport:: Multibyte:: Chars, например так:

post.content.mb_chars.limit(200).to_s

см. http://api.rubyonrails.org/v3.1.1/classes/ActiveSupport/Multibyte/Chars.html

У меня была очень похожая проблема (усечение строк на разных языках), и это сработало для моего случая. Это делается после того, как убедитесь, что кодировка везде установлена ​​в UTF-8: конфигурации rails, определения базы данных и / или таблицы базы данных, а также любые html-шаблоны.

Если ваша строка HTML, я бы посоветовал вам проверить гем truncate_html. Я не использовал его с такими символами, но он должен знать, где можно безопасно обрезать строку.

Есть простой способ, но не хорошее решение. Прежде всего вы должны убедиться, что вы сохраняете контент в формате UTF-8. Это может не понадобиться.

content = "éééé"
post.content = content.force_encoding('utf-8') unless content.encoding.to_s = "UTF-8"

Затем, когда вы читаете это, вы можете прочитать, заставить его обратно

<%= raw truncate(strip_tags(post.content.force_encoding('utf-8')), :length => 200) %>

Я написал стих, чтобы помочь усечь, выровнять, обернуть многобайтовый текст с поддержкой языков без пробелов (японский, китайский и т. Д.)

truncation = Verse::Truncation.new 'ラドクリフ、マラソン五輪代表に1万m出場にも含み'
truncation.truncate(12)   # => "ラドクリフ…"
Другие вопросы по тегам