2010-11-10 132 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