如何将别名添加到Ruby 1.9';s Enocding.alias?
想要为PayPal可能用于其IPN(即时支付通知)的其中一个字符集添加别名 这被悄悄地忽略了:如何将别名添加到Ruby 1.9';s Enocding.alias?,ruby,encoding,character-encoding,ruby-1.9,Ruby,Encoding,Character Encoding,Ruby 1.9,想要为PayPal可能用于其IPN(即时支付通知)的其中一个字符集添加别名 这被悄悄地忽略了: Encoding.aliases["x-mac-greek"] = "macGreek" 这也行不通: Encoding.aliases.update("x-mac-greek" => "macGreek") 还有其他建议吗?我认为这是不可能的。如果你看一下,你会发现每次调用它时,它都会创建一个新的散列,并将别名从内部表示复制到其中 从我看来,似乎没有任何方法可以从Ruby程序中修改这些内部
Encoding.aliases["x-mac-greek"] = "macGreek"
这也行不通:
Encoding.aliases.update("x-mac-greek" => "macGreek")
还有其他建议吗?我认为这是不可能的。如果你看一下,你会发现每次调用它时,它都会创建一个新的散列,并将别名从内部表示复制到其中 从我看来,似乎没有任何方法可以从Ruby程序中修改这些内部数据
可能您只需要检查从PayPal获得的字符串,然后再尝试将其用作编码。您可以强制执行
编码的新定义。别名
。它对你的目的可能有用,也可能不有用:我不知道它是否会被其他课程学习;它应该,但可能不是
Encoding.instance_eval <<__END
alias :orig_aliases :aliases
def aliases
orig_aliases.update("x-mac-greek" => "macGreek")
end
__END
Encoding.instance\u eval以下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);
}
#包括
外部值rb_编码;
int rb_encdb_别名(常量字符*别名,常量字符*原始);
/*
*将别名添加到现有编码
*
*编码。添加_别名(“希伯来语”,“Windows-1255”)->“希伯来语”
*
*/
值rb\u添加\u别名(值自身、值别名、值来源)
{
如果(rb_encdb_别名(RSTRING_PTR(别名)、RSTRING_PTR(原始))=-1){
返回Qnil;
}否则{
返回别名;
}
}
void Init_enc_别名(){
rb_定义单例方法(rb_编码,“添加别名”,rb_添加别名,2);
}
这只会影响从别名返回的数组。Ruby使用的内部数据结构将保持不变。例如,它不允许您执行“Foo”。强制_编码(“x-mac-greek”)
-您将获得参数错误:未知编码名称-x-mac-greek
,与其他情况相同。如果强制_编码
使用编码的返回值。别名
,则工作正常。但是对于这样一个经常使用的方法来说,选择一个快捷方式并读取用于生成原始编码.别名散列的相同内部数据是有意义的。感谢您的深入了解。很明显,我试图实现的是不可能的。这些别名是如何在Ruby中加载的?有没有办法加入到这个过程中来添加更多别名?