2010-11-10 138 views
1

我創建了一個返回JSON的WebAPI。Ruby 1.9和HTTParty的JSON編碼問題

初始數據如下(UTF-8編碼):

@text="Rosenborg har ikke h\xC3\xB8rt hva Steffen" 
與我的對象上的.to_json

那麼,這裏是由API發送(我認爲這是ISO-8859- 1個編碼):

"text":"Rosenborg har ikke h\ufffd\ufffdrt hva Steffen" 

我使用HTTParty在客戶端,而這正是我終於得到:

"text":"Rosenborg har ikke h��rt hva" 

兩個WebAP我和客戶端應用程序使用Ruby 1.9.2和Rails 3.

我有點失落,這個編碼問題...我試圖添加utf8編碼頭到我的ruby文件,但它沒有改變任何東西。 我想我錯過了某個地方的編碼/解碼部分......任何人有想法?

非常感謝! Vincent

回答

1

在Ruby 1.9中,編碼現在是明確的。但是,Rails可能會或可能不會被配置爲以您期望的編碼發送響應。您必須設置全局配置設置:

Encoding.default_external = "utf-8". 

我相信Ruby默認指定的序列化編碼是平臺的默認設置。在Windows上的美國將是CodePage-1251。其他國家會有一個替代編碼。

編輯:也看到這個URL,如果JSON是針對MySQL的執行:https://rails.lighthouseapp.com/projects/8994/tickets/5210-encoding-problem-in-json-format-response

編輯2:Rails核心及其套件庫將尊重編碼(ActiveRecord的,等。)。 default_external配置設置,它對所有發送的值進行編碼。不幸的是,由於編碼對於Ruby來說是一個相對較新的概念,因此並不是每個第三方庫都已經過適當編碼調整。那些庫可能需要額外的配置設置。這包括MySQL和您正在使用的RSolr庫。

在1.9系列之前的所有Ruby版本中,字符串只是一個字節數組。當你一直這樣思考的時候,很難將你的頭圍繞多字符串編碼的概念。現在更令人困惑的是,與Java,C#和其他使用某種形式的UTF作爲本機字符串格式的語言不同,Ruby允許每個字符串以不同的方式進行編碼。回想起來,這可能是一個錯誤,但至少現在他們正在尊重編碼。

Encoding.force_encoding方法被設計爲用該新編碼處理字節序列,但不改變任何基礎數據。所以可能會有無效的字節序列。還有另一種稱爲.encode()的方法,它將字節從一種編碼轉換爲另一種編碼,並保證有效的字節序列。欲瞭解更多信息,請閱讀此:

http://blog.grayproductions.net/articles/ruby_19s_string

+0

我該如何着手改變序列化的編碼? – 2010-11-12 12:13:36

+0

看看我的第二個編輯。它有更多關於Ruby 1.9的新編碼特性和你需要記住的事情的信息。 – 2010-11-12 13:03:46

+0

我有這個問題,但與sqlite3。當我通過視圖渲染,但使用渲染時工作得很好:json我得到了這個確切的問題。 – 2010-11-12 14:16:09

1

好吧,我終於找到了問題的是什麼...

我使用RSolr擺脫Solr的我的數據,並通過對所有結果的默認編碼是不幸的是這裏提到(並檢查由我自己)「US-ASCII」: http://groups.google.com/group/rsolr/browse_thread/thread/2d4890fa7737e7ef#

所以,你需要強制編碼如下:

my_string.force_encoding(Encoding::UTF_8) 

也許有一個很好的編碼選項提供給RSolr!

+0

這種方法檢查它們。這不是一個答案。 – g33kz0r 2010-12-16 19:25:48