【问题标题】:JSON encoding issue with Ruby 1.9 and HTTPartyRuby 1.9 和 HTTParty 的 JSON 编码问题
【发布时间】:2010-11-10 17:03:23
【问题描述】:

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

非常感谢!!! 文森特

【问题讨论】:

    标签: ruby json httparty


    【解决方案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

    【讨论】:

    • 如何更改序列化的编码?
    • 查看我的第二次编辑。它包含更多关于 Ruby 1.9 的新编码功能以及您需要记住的事项的信息。
    • 我遇到了这个问题,但使用的是 sqlite3。当我通过视图渲染时效果很好,但使用 render :json 我得到了这个确切的问题。
    • 这可能意味着您从数据库中获取的数据没有正确编码,您应该使用 my_string.encoding 方法检查它们
    【解决方案2】:

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

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

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

    my_string.force_encoding(Encoding::UTF_8)
    

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

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2012-07-07
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多