1

我正在开发一个使用ruby​​ 1.9.3mongoid作为我的 ORM的rails 3.1应用程序。我面临一个烦人的问题。我想像这样截断帖子的内容:

<%= 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

4 回答 4

3

可能为时已晚,无法帮助您解决问题,但是...您可以使用 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 模板。

于 2013-09-06T19:33:13.810 回答
1

如果您的字符串是 HTML,那么我建议您查看truncate_html gem。我没有将它与这样的字符一起使用,但它应该知道它可以安全地截断字符串的位置。

于 2012-02-09T10:11:34.020 回答
0

有一个简单的方法,但不是一个好的解决方案。首先,您必须确保您保存的内容是 UTF-8。这可能没有必要。

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

然后,当您阅读它时,您可以阅读 force it back

<%= raw truncate(strip_tags(post.content.force_encoding('utf-8')), :length => 200) %>
于 2012-02-10T14:22:25.303 回答
0

我编写了字符串来帮助截断、对齐、换行多字节文本,并支持无空格语言(日语、中文等……)

Strings.truncate('ラドクリフ、マラソン五輪代表に1万m出場にも含み', 12)
# => "ラドクリフ…"
于 2015-02-15T19:09:22.343 回答