2012-02-09 27 views
0

我正在使用rails 3.1应用程序ruby​​ 1.9.3mongoid作为我的ORM。我正面临一个烦人的问题。我想截断后的内容是这样的:Rails截断包含&eacute的UTF-8字符串; (例如)

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

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

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

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

什么我上面做一个简单的方式做到这一点:

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

貌似截断是看到像&eacute;&eactute;&eacute;&eacute;字符串的每一个字。

有没有办法要么:

  1. 有截断处理实际UTF-8字符串,其中“E”代表一个字符?那将是我最喜欢的方法。
  2. 哈克上述指令这样的结果是更好的,像力导轨2个字之间截断,

我问这个问题,因为我还没有发现任何解决至今。这是我应用程序中唯一存在这种字符问题的地方,因为网站的全部内容都是法文的,所以它是一个主要问题,因此包含大量的é, ç, à, ù

此外,我认为这种行为是相当不幸的truncate帮手,因为在我的情况下,它根本不截断200个字符,但约25个字符!

+0

是否'post.content'使用UTF-8é或HTML'&eacute;'实体? – 2012-02-09 08:43:10

+0

好问题。我如何检查?我敢打赌&eacute。我知道这可能是一个更大问题的症状,我只想把我的问题集中在一些特定和简单的问题上。所以也许有办法通过确保mongo存储UTF-8字符串来处理整个事情,但我不知道如何检查.. – rpechayr 2012-02-09 08:47:00

+0

@ muistooshort我更新了我的问题以更好地反映情况。我在条纹html字符串的上下文中。它有帮助吗? – rpechayr 2012-02-09 08:51:36

回答

2

可能为时已晚,以帮助您的问题,但... 可以使用的ActiveSupport ::多字节字符数::极限法,像这样:

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

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

+0

对不起,这个宝石似乎并没有在我的情况下工作 – rpechayr 2012-02-14 13:10:21

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) %> 
0

我写verse帮助截断,对齐,缠上支持多字节文本没有空格语言(日本,中国等)

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