Ruby 1.9和HTTParty的JSON编码问题

时间:2010-11-10 17:03:23

标签: ruby json httparty

我创建了一个返回JSON的WebAPI。

初始数据如下(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"

WebAPI和客户端应用程序都使用Ruby 1.9.2和Rails 3。

我有点迷失这个编码问题...我试图将utf8编码标题添加到我的ruby文件但它没有改变任何东西。 我想我在某个地方错过了一个编码/解码部分...任何人都有想法?

非常感谢!!! 文森特

2 个答案:

答案 0 :(得分:1)

在Ruby 1.9中,编码现在是显式的。但是,Rails可能配置也可能不配置为以您期望的编码发送响应。您必须设置全局配置设置:

Encoding.default_external = "utf-8".

我相信Ruby默认为序列化指定的编码是平台默认值。在Windows上的美国将是CodePage-1251。其他国家/地区会有其他编码。

编辑:如果json是针对MySQL执行的,请看这个网址:https://rails.lighthouseapp.com/projects/8994/tickets/5210-encoding-problem-in-json-format-response

编辑2 :Rails核心及其库套件(ActiveRecord等)将遵循Encoding.default_external配置设置,该设置对其发送的所有值进行编码。不幸的是,因为编码对于Ruby来说是一个相对较新的概念,并不是每个第三方库都已经过调整以适当编码。那些库可能需要额外的配置设置。这包括MySQL和您正在使用的RSolr库。

在1.9系列之前的所有Ruby版本中,字符串只是一个字节数组。当你这么长时间思考这个问题时,很难围绕多个字符串编码的概念。现在更令人困惑的是,与Java,C#和其他使用某种形式的UTF作为本机字符串格式的语言不同,Ruby允许对每个字符串进行不同的编码。回想起来,这可能是一个错误,但至少现在他们尊重编码。

Encoding.force_encoding方法旨在使用新编码处理字节序列,但不会更改任何基础数据。因此可能有无效的字节序列。还有另一种称为.encode()的方法,它将字节从一种编码转换为另一种编码,并保证有效的字节序列。欲了解更多信息,请阅读:

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

答案 1 :(得分:1)

好的,我终于找到了问题所在......

我正在使用RSolr从Solr获取我的数据,默认情况下,所有结果的编码都是“US-ASCII”,如此处所述(并由我自己检查): http://groups.google.com/group/rsolr/browse_thread/thread/2d4890fa7737e7ef#

所以你需要强制编码如下:

my_string.force_encoding(Encoding::UTF_8)

可能有一个很好的编码选项提供给RSolr!