1

我创建了一个返回 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​​ 文件中,但它没有改变任何东西。我想我在某处缺少编码/解码部分......有人有想法吗?

非常感谢你 !!!文森特

4

2 回答 2

1

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

Encoding.default_external = "utf-8".

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

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

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

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

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

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

于 2010-11-10T17:28:23.507 回答
1

好吧,我终于知道问题出在哪里了……

我正在使用 RSolr 从 Solr 获取我的数据,不幸的是,所有结果的默认编码都是此处提到的“US-ASCII”(并由我自己检查): http ://groups.google.com/group/rsolr/浏览线程/线程/2d4890fa7737e7ef#

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

my_string.force_encoding(Encoding::UTF_8)

可能有一个不错的编码选项可以提供给 RSolr!

于 2010-11-11T08:49:28.610 回答