2011-08-30 67 views
4

我的應用程序允許用戶輸入文本。當他們從MS Word複製和粘貼時,它會粘貼智能引號,明智的省略號和省略號。這些字符被保存到數據庫中並導致問題。用普通引號(「),撇號(')和句點(...)替換這些非UTF-8字符的最佳方法是什麼?Rails 3中取代智能引號,智能撇號和省略號的最佳方式是什麼?

另外,你如何測試這個功能?我添加了一個測試。與這些特殊字符和# encoding: ISO-8859-1在文件頂部的特殊字符導致測試停止運行:/home/george/.rvm/gems/ruby-1.9.2-p180/gems/redgreen-1.2.2/lib/redgreen.rb:62:in 'sub': invalid byte sequence in UTF-8 (ArgumentError) ...顯然redgreen寶石是這些字符不兼容...

感謝

+2

如果這些字符是「非UTF-8」字符,則無法將它們保存爲UTF-8編碼的字符串。不,他們是非常多的Unicode字符! '''例如是U + 201C。它們不是你想要的字符('''U + 0022)。'redgreen'問題可能正是因爲你正在使用'#編碼:ISO-8859-1'而不是UTF-8。 – deceze

回答

0

,你可以?。添加一個before_save方法,將你的文本轉換爲UTF-8相應的字符,如果你只有一個字段可能包含非UTF8字符,那麼它很簡單,如果你有很多字段,那麼會更好,如果您可以動態地遍歷已更改的文本/字符串字段並修復UTF-8問題。無論哪種方式,你需要使用String#encode。這裏是一個例子

before_save :fix_utf8_encoding 

def fix_utf8_encoding 
    columns = self.class.columns.select{|col| [:text,:string].include?(col.type)}.map{|col| col.name.to_sym} 
    columns.each do |col| 
    self[col] = self.self[col].encode('UTF-8', :invalid => :replace, :undef => :replace) if self[col].kind_of?(String) #Double checking just in case. 
    end 
end 
private :fix_utf8_encoding 

而對於獎勵積分,你還可以檢查是否更改欄使用方便的領域?修復它之前幫手。

+1

不幸的是,這實際上並沒有取代這個字符:'''' – DGM

+0

這實際上並不是用正確的字符替換字符,它只是去掉壞字符,例如,微軟「應該被替換」,但是它只是刪除它。 – gregblass

相關問題