希望为PayPal可用于其IPN(即时付款通知)的其中一个字符集添加别名。
这是默默无闻的:
Encoding.aliases["x-mac-greek"] = "macGreek"
这不起作用:
Encoding.aliases.update("x-mac-greek" => "macGreek")
还有其他建议吗?
答案 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