我正在使用ruby 1.9.3和mongoid作为我的ORM开发rails 3.1应用程序。我正面临一个烦人的问题。我想截断这样一篇文章的内容:
<%= raw truncate(strip_tags(post.content), :length => 200) %>
我使用raw
和strip_tags
,因为我的post.content
实际上是用富文本编辑器处理的。
我对非ASCII字符有一个严重的问题。想象一下我的帖子内容如下:
éééé éééé éééé éééé éééé éééé éééé éééé
我在上面以一种天真的方式做的事情是这样的:
éééé éééé éééé éééé éééé &eac...
看起来truncate看到的是像é&eactute;éé
这样的字符串中的每个单词。
有没有办法:
- 是否使用truncate处理实际的UTF-8字符串,其中"é"代表单个字符?这将是我最喜欢的方法
- 破解上面的指令以使结果更好,比如强制rails在2个字之间截断
我之所以提出这个问题,是因为到目前为止,我还没有找到任何解决方案。这是我的应用程序中唯一一个有这种性格问题的地方,这是一个主要问题,因为网站的整个内容都是法语的,所以包含了很多é, ç, à, ù
。
此外,我认为这种行为对于truncate
助手来说是非常不幸的,因为在我的情况下,它根本不会截断200个字符,而是大约截断25个字符!
可能为时已晚,无法解决您的问题,但是。。。您可以使用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模板。
如果您的字符串是HTML,那么我建议您查看truncate_HTML gem。我还没有将它与这样的字符一起使用,但它应该知道在哪里可以安全地截断字符串。
有一个简单的方法,但不是一个好的解决方案。首先,您必须确保保存的内容是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) %>
我编写了字符串来帮助截断、对齐、包装多字节文本,并支持无空白语言(日语、中文等)
Strings.truncate('ラドクリフ、マラソン五輪代表に1万m出場にも含み', 12)
# => "ラドクリフ…"