Rails усекает строки UTF-8, содержащие & eacute; (например) - PullRequest
1 голос
/ 09 февраля 2012

Я работаю над приложением 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. Взломайте приведенную выше инструкцию так, чтобы результат получился лучше, например, заставьте рельсы сокращаться между 2 словами

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

Также,Я думаю, что такое поведение весьма прискорбно для помощника truncate, потому что в моем случае он вообще не усекает 200 символов, а приблизительно 25 символов!

Ответы [ 4 ]

2 голосов
/ 06 сентября 2013

Возможно, слишком поздно, чтобы помочь с вашей проблемой, но ... Вы можете использовать метод ограничения 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-шаблоны.

1 голос
/ 09 февраля 2012

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

0 голосов
/ 15 февраля 2015

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

Strings.truncate('ラドクリフ、マラソン五輪代表に1万m出場にも含み', 12)
# => "ラドクリフ…"
0 голосов
/ 10 февраля 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) %>
...