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



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

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

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

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

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

我在上面以一种天真的方式做的事情是这样的:

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

看起来truncate看到的是像&eacute;&eactute;&eacute;&eacute;这样的字符串中的每个单词。

有没有办法:

  1. 是否使用truncate处理实际的UTF-8字符串,其中"é"代表单个字符?这将是我最喜欢的方法
  2. 破解上面的指令以使结果更好,比如强制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)
# => "ラドクリフ…"

相关内容

  • 没有找到相关文章

最新更新