Rails截断包含é的UTF-8字符串(例如)

时间:2012-02-09 08:33:40

标签: ruby-on-rails-3 utf-8 truncate multibyte-characters

我正在使用 ruby​​ 1.9.3 mongoid 作为我的ORM处理 rails 3.1 应用。我正面临一个恼人的问题。我想截断这样一篇文章的内容:

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

我正在使用rawstrip_tags,因为我的post.content实际上是使用富文本编辑器处理的。

我对非ASCII字符存在严重问题。想象一下,我的帖子内容如下:

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

我上面以天真的方式做的是:

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

看起来truncate正在查看字符串中的每个单词,如&eacute;&eactute;&eacute;&eacute;

有没有办法:

  1. 截断处理实际的UTF-8字符串,其中'é'代表单个字符?那将是我最喜欢的方法。
  2. 破解上面的指令,使得结果更好,就像强制轨道截断两个单词一样,
  3. 我问这个问题,因为到目前为止我还没有找到任何解决方案。这是我的应用程序中唯一一个有这种角色问题的地方,这是一个主要问题,因为网站的整个内容都是法语,所以包含了很多é, ç, à, ù

    另外,我认为这种行为对truncate助手来说非常不幸,因为在我的情况下它根本不会截断200个字符,而是大约25个字符!

4 个答案:

答案 0 :(得分:2)

可能为时已晚,无法帮助解决您的问题,但...... 您可以使用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 config,数据库配置和/或数据库表定义,以及任何html模板。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

有一种简单的方法,但不是一个好的解决方案。首先,您必须确保您保存的内容是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) %>

答案 3 :(得分:0)

我写了strings来帮助截断,对齐,包装多字节文本,不支持空白语言(日语,中文等...)

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