【问题标题】:String.force_encoding() in Ruby 1.8.7 (or Rails 2.x)Ruby 1.8.7(或 Rails 2.x)中的 String.force_encoding()
【发布时间】:2011-01-03 11:06:40
【问题描述】:

是否有在 Ruby 1.8.7(或 Rails 2.x)中使用 String.force_encoding() 的解决方案,以便它像在 Ruby 1.9 中一样工作?我读过一些关于 require active_support 的内容,但这不起作用

$> 宝石列表--local | grep 'rails\|activesupport'

 activesupport (3.0.3, 2.3.8, 2.3.5)
 rails (2.3.8, 2.3.5)

$> ruby -v

ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10.4.0]

$> rails -v

Rails 2.3.8

irb:

> require "rubygems"
=> true 
> require "active_support"
=> true 
> "asdf".force_encoding("UTF-8")
NoMethodError: undefined method `force_encoding' for "asdf":String
> String.respond_to?(:force_encoding)
=> false

【问题讨论】:

    标签: ruby-on-rails ruby encoding gem


    【解决方案1】:

    这将在 Ruby 1.8.7 和 Ruby 1.9 中为您提供 String#to_my_utf8:

    require 'iconv'
    class String
      def to_my_utf8
        ::Iconv.conv('UTF-8//IGNORE', 'UTF-8', self + ' ')[0..-2]
      end
    end
    

    然后……

    ?> "asdf".to_my_utf8
    => "asdf"
    

    受到Paul Battley 的启发,同时还记得我在remote_table gem 上的一些较早的工作。

    【讨论】:

    • 出于好奇:为什么要加两个空格,然后转换后去掉?
    • 这是 Paul Battley 的贡献......正如他所说,“'危险'字节是 194-253 范围内的那些”......如果字符串以其中一个结尾,则转换有时会失败起来。
    • 为什么需要红宝石?另外,您建议将顶部代码放在哪里?在每个控制器的控制器中你可以使用它吗?
    • 我会说只是在某处放置一次 require "iconv" 作为风格问题。好点...我们不需要红宝石!
    • 这个解决方案似乎无法处理 unicode é 字符,这是真的吗?
    【解决方案2】:

    force_encoding 在 1.9 中唯一做的事情是它改变了字符串的编码字段,它实际上并没有修改字符串的字节。

    Ruby 1.8 没有字符串编码的概念,所以force_encoding 将是一个空操作。如果您希望能够在 1.8 和 1.9 中运行相同的代码,您可以这样自己添加:

    class String
      def force_encoding(enc)
        self
      end
    end
    

    当然,您还需要做其他事情才能使编码在 1.8 和 1.9 中的工作方式相同,因为它们处理这个问题的方式非常不同。

    【讨论】:

    • 可能是一个愚蠢的问题,但我应该在我的代码中的什么位置添加这个?
    • 任何地方都可以,或多或少。将其放入一个文件中,并为该文件添加一个 require 以及您的“主要”.rb 顶部的所有其他 requires。
    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多