【问题标题】:Handling string encoding with the same code in Ruby 1.8 and 1.9在 Ruby 1.8 和 1.9 中使用相同的代码处理字符串编码
【发布时间】:2011-07-20 04:55:00
【问题描述】:

我有一个gem,它让一群人使用了一堆不同的 Ruby 解释器,它包括归结为这段代码的内容:

res = RestClient.post(...)
doc = REXML::Document.new(res).root

res 的内容始终是 UTF-8,这在 Ruby 1.8 中可以正常工作,但如果响应不是纯 ASCII,则在 Ruby 1.9 下它会爆炸并且用户的默认编码是不是 UTF-8。

现在,如果我想单独在 Ruby 1.9 上进行这项工作,我只需将 res.force_encoding('utf-8') 粘贴在那里并完成它,但该方法仅适用于 1.9,然后在 Ruby 1.8 下中断:

NoMethodError: undefined method `force_encoding' for #<String:0x101318178>

能想出的最佳解决方案是这样,它强制系统范围的默认编码为 UTF-8:

Encoding.default_external = 'UTF-8' if defined? Encoding

更好的想法,或者这是最好的?是否会对尝试使用不同编码的图书馆用户产生负面影响?

【问题讨论】:

  • 澄清一下,我可以依赖传入的内容始终是有效的 UTF-8。 Ruby 1.9 中的问题是字符串 res 被标记为用户的默认编码,可能不是 UTF-8,这会导致 REXML 出错。

标签: ruby character-encoding ruby-1.9 ruby-1.8


【解决方案1】:
  if res.respond_to?(:force_encoding)
    new_contents = res.force_encoding("UTF-8")
  else
    new_contents = res
  end

为了向后兼容,我会做类似的事情。

【讨论】:

  • 但这是一个可怕的组合,我不想污染我创建字符串的代码的每一点......
【解决方案2】:

我和 Mike Lewis 一起使用 respond_to,但不要在代码中各处的变量 res 上这样做。

我查看了your code in gateway.rb,它看起来就像您在使用res 的任何地方一样,它是通过调用make_api_request 设置的,因此您可以在该方法中的return 语句之前添加它:

doc = doc.force_encoding("UTF-8") if doc.respond_to?(:force_encoding) 

即使是在其他地方,但不是字面上遇到的每个字符串,我相信你可以找到一种方法来重构有意义的代码,并在一个地方而不是你遇到的任何地方解决问题。

你在其他地方有问题吗?

【讨论】:

  • 我不知道,但这并不意味着它们不存在......但你的解决方案是迄今为止最好的!
【解决方案3】:

据我从sn-p看到的,问题的原因是RestClient,它没有返回正确编码的字符串(HTTP响应中指定的那个),所以我首先尝试解决这个问题。如果无法做到这一点,那么您可以使用强制编码的代码包装RestClient 调用(Mike Lewis 建议的方式)。或者您在RestClient 呼叫以外的地方也遇到了问题?

【讨论】:

    【解决方案4】:

    如果您在使用此方法的特定文件中包含#encoding: utf-8 标头,它是否有效。

    Ruby 1.9 在整个应用程序中支持不同的编码,如果此内容是 utf-8 编码的,应该可以正常工作。

    Ruby 1.8 将简单地忽略 #encodingheader 并继续正常工作。

    这是一个非常简单的方法,但我相信它值得一试!

    【讨论】:

    • 据我了解,文件头控制源编码,仅用于该源文件中的字符串(例如str = "Foo")。它对I/O(例如Restclient)获取的数据没有影响,其默认由外部编码设置。见blog.grayproductions.net/articles/…
    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多