2014-02-11 59 views
1

我正在努力在Rails中找到能夠將UTF-8代碼轉換爲其可顯示值的正確方法。Ruby on Rails:內容爲%F1的UTF-8編碼字符串

就我而言,如果可能的話,它會將一些用戶輸入(如「John%20Da%F1e」)轉換爲「JohnDañe」。

目前,我有以下幾點:

unescaped_name = CGI::unescape(params[:name]) # this turns "John%20Da%F1e" into "John Da\xF1e" 
@q = I18n.transliterate(unescaped_q) #this yields an 'invalid byte sequence in UTF-8' error 

從本質上講,我試圖從 「約翰%20DA%F1E」(以UTF-8已編碼),以 「約翰·戴恩」 去了。

有一件事我已經試過了

.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') 

,但它取代了ASCII(%到\ x)與 「約翰金大中」。

回答

2

你需要告訴Ruby解析的字符串的編碼應該是。看起來你在用Latin-1開始工作('ISO-8859-1')。有幾種不同的選擇。如果你想限制這一決定只是你正在處理的字符串,可以使用.force_encoding這樣

require 'cgi' 
unescaped_name = CGI::unescape("John%20Da%F1e").force_encoding('ISO-8859-1') 
# => "John Da\xF1e" 
unescaped_name.encode('UTF-8') 
# => "John Dañe" 

注意,一旦編碼設置正確,它已經包含正確的字符,但你贏了只有在將其轉換爲可顯示的編碼之後,才能看到它。因此,在我顯示"John Da\xF1e"的情況下,這僅僅是因爲我的終端設置爲顯示UTF-8 - \xF1是Latin-1編碼中ñ的字節。


據我所知,在單一步驟中URI編碼的UTF-8字節的字符串相同的是這樣的:

"John%20Da%C3%B1e" 
CGI::unescape("John%20Da%C3%B1e") 
# => "John Dañe" 
+0

嘿尼爾你能來看看嗎? - > http://stackoverflow.com/questions/23029367/before-action-on-import-from-csv –

相關問題