【问题标题】:How can I add an alias to Ruby 1.9's Enocding.aliases?如何为 Ruby 1.9 的 Enocding.aliases 添加别名?
【发布时间】:2012-01-24 20:24:21
【问题描述】:

想要为 PayPal 可能用于其 IPN(即时付款通知)的字符集之一添加别名。

这被默默地忽略了:

Encoding.aliases["x-mac-greek"] = "macGreek"

这也不起作用:

Encoding.aliases.update("x-mac-greek" => "macGreek")

还有其他建议吗?

【问题讨论】:

    标签: ruby encoding character-encoding ruby-1.9


    【解决方案1】:

    我认为这是不可能的。如果您查看the source for the aliases method,您会发现每次调用它时都会创建一个新的哈希值,并从内部表示中复制别名。

    据我所知,似乎没有任何方法可以从 Ruby 程序中修改这些内部数据。

    也许您只需要在尝试将其用作编码之前检查您从 PayPal 获得的字符串。

    【讨论】:

    • 感谢您的洞察力。我想要达到的目标是不可能的,这很清楚。
    • 如何在 Ruby 中加载这些别名?有没有办法加入该过程以添加更多别名?
    【解决方案2】:

    以下 C 扩展将起作用:

    #include <ruby.h>
    
    extern VALUE rb_cEncoding;
    int rb_encdb_alias(const char *alias, const char *orig);
    
    /*
     * Add alias to an existing encoding
     *
     * Encoding.add_alias('hebrew', 'Windows-1255') -> 'hebrew'
     *
     */
    VALUE rb_add_alias(VALUE self, VALUE alias,  VALUE orig)
    {
        if (rb_encdb_alias(RSTRING_PTR(alias), RSTRING_PTR(orig)) == -1) {
            return Qnil;
        } else {
            return alias;
        }
    }
    
    void Init_enc_alias() {
        rb_define_singleton_method(rb_cEncoding, "add_alias", rb_add_alias, 2);
    }
    

    【讨论】:

      【解决方案3】:

      您可以强制重新定义Encoding.aliases。它可能对你的目的有用也可能没用:我不知道它是否会被其他班级接受;应该,但可能不会。

      Encoding.instance_eval <<__END
          alias :orig_aliases :aliases
          def aliases
              orig_aliases.update("x-mac-greek" => "macGreek")
          end
      __END
      

      【讨论】:

      • 这只会影响从aliases 返回的数组。 Ruby 使用的内部数据结构将保持不变。例如,它不允许你做"Foo".force_encoding("x-mac-greek") - 你得到ArgumentError: unknown encoding name - x-mac-greek,就像你做其他事情一样。
      • 如果force_encoding 使用Encoding.aliases 的返回值,它会工作得很好。但是这种常用的方法走捷径,读取用于生成原始Encoding.aliases哈希的相同内部数据是有意义的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 2010-12-25
      • 2010-09-06
      • 2018-12-11
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多