2012-02-09 51 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) # => "ラドクリフ…"