2013-03-06 62 views
0

我有一個rails服務器從android應用程序獲取輸入。這個android應用程序以JSON格式將一些數據傳遞給服務器,但當前版本的應用程序不會將該字符串編碼爲UTF-8,因此它仍然是「二進制」的,例如, '\ xE0'而不是'\ uE0'。但是,當將這個二進制字符串發送到服務器時,應用程序將http連接設置爲編碼UTF-8,這意味着接收該字符串的Web服務器認爲該編碼爲UTF-8,但實際上編碼爲「二進制」。Ruby on Rails:如何在接收時處理錯誤的編碼JSON字符串

我解決了這個部分有以下行:

# encode comment to UTF-8 and strip whitespace from comment field 
params[:data][:text].encode('utf-8', 'binary', :invalid => :replace, :undef => :replace).gsub!(/\s+/, " ") 

這是從這裏取:Ruby String.encode still gives "invalid byte sequence in UTF-8"

它工作正常,在我的開發系統,開始在網絡服務器的WEBrick構建,但不幸的是這給在我的生產系統上運行的Apache/Passenger上的不同行爲,它不會用'?'替換錯誤的字符。但在第一個無效的節點上休息。

在使用WEBrick我得到

' so un\xE4hnlich ' => 'so un?hnlich' 

在Apache上使用相同的代碼,紅寶石(1.9.3)和導軌(3.1.1)的版本,我得到

' so un\xE4hnlich ' => 'so un' 

一定有什麼東西我可以做,我不知道去哪裏嘗試:在apache配置上,在代碼上,在ruby包上...?

+0

有趣的是,即使使用Apache,日誌文件也包含帶有特殊字符的整個文本。如果我可以像這樣把它放到數據庫中,對我來說真的就夠了。 – Schlangi 2013-03-11 08:59:40

回答

0

幸運的是,我找到了這個棘手問題的答案 - 事實證明,這是數據庫級別的問題!
令人驚訝的耙db:創建:所有語句確實創建生產數據庫與編碼UTF-8,就像在database.yml中配置,但它與開發數據庫的(MySQL默認)LATIN-1,雖然這也被標記爲使用UTF-8在同一個database.yml文件中。
對於有此問題的未來用戶:請檢查您的database.yml文件以編碼您的數據庫。

development: 
    adapter: mysql2 
    encoding: utf8 
[...] 

test: 
    adapter: mysql2 
    encoding: utf8 
[...] 

production: 
    adapter: mysql2 
    encoding: utf8 
[...] 

我能理解全編碼的東西感謝這個博客:http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/

在問題中的代碼工作正常,如果你瞭解,發送到數據庫中的哪些編碼...

相關問題