Rails обрезает строки UTF-8, содержащие (например)

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

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

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

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

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

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

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

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

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

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

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

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


person rpechayr    schedule 09.02.2012    source источник
comment
Использует ли post.content UTF-8 é или сущность HTML &eacute;?   -  person mu is too short    schedule 09.02.2012
comment
Хороший вопрос. Как я могу это проверить? Я бы поставил на é. Я знаю, что это может быть признаком гораздо более серьезной проблемы, я просто хотел сосредоточить свой вопрос на чем-то конкретном и простом. Так что, возможно, есть способ справиться со всем этим, убедившись, что монго хранит строки UTF-8, но я не знаю, как это проверить.   -  person rpechayr    schedule 09.02.2012
comment
@muistooshort Я обновил свой вопрос, чтобы лучше отразить ситуацию. Я нахожусь в контексте полосатой строки html. Это помогает?   -  person rpechayr    schedule 09.02.2012


Ответы (4)


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

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

см. http://api.rubyonrails.org/v3.1.1/classes/ActiveSupport/Multibyte/Chars.html#method-i-limit

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

person etolpygo    schedule 06.09.2013

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

person Nick    schedule 09.02.2012

Есть простой способ, но не красивое решение. Сначала вы должны убедиться, что сохраняемый вами контент имеет кодировку 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) %>
person twooface    schedule 10.02.2012

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

Strings.truncate('ラドクリフ、マラソン五輪代表に1万m出場にも含み', 12)
# => "ラドクリフ…"
person Piotr Murach    schedule 15.02.2015