Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将别名添加到Ruby 1.9';s Enocding.alias?_Ruby_Encoding_Character Encoding_Ruby 1.9 - Fatal编程技术网

如何将别名添加到Ruby 1.9';s Enocding.alias?

如何将别名添加到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程序中修改这些内部

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

这被悄悄地忽略了:

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中加载的?有没有办法加入到这个过程中来添加更多别名?