如何在Ruby 1.9的Encoding.aliases中添加别名?

时间:2012-01-24 20:24:21

标签: ruby encoding character-encoding ruby-1.9

希望为PayPal可用于其IPN(即时付款通知)的其中一个字符集添加别名。

这是默默无闻的:

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

这不起作用:

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

还有其他建议吗?

3 个答案:

答案 0 :(得分:1)

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

从我所看到的,看起来没有任何方法可以从Ruby程序修改这个内部数据。

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

答案 1 :(得分:1)

以下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);
}

答案 2 :(得分:0)

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

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