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...
Похоже, усечение видит каждое слово строки как é&eactute;éé
,
Есть ли способ либо:
- Обрезать ли обработчик фактические строки UTF-8, где "é" обозначает один символ? Это был бы мой любимый подход.
- Взломайте приведенную выше инструкцию так, чтобы результат был лучше, например, заставьте рельсы усекаться между двумя словами,
Я задаю этот вопрос, потому что я не нашел никакого решения до сих пор. Это единственное место в моем приложении, где у меня есть проблемы с таким персонажем, и это серьезная проблема, так как весь контент сайта на французском языке, поэтому содержит много é, ç, à, ù
,
Кроме того, я думаю, что это поведение весьма неудачно для 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) # => "ラドクリフ…"