Как добавить псевдоним в Enocding.aliases в Ruby 1.9? - PullRequest
1 голос
/ 25 января 2012

Хотел добавить псевдоним для одной из кодировок, которые PayPal может использовать для своего IPN (мгновенного уведомления о платеже).

Это игнорируется:

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

Это неработа, либо:

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

Любые другие предложения?

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Будет работать следующее расширение 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);
}
1 голос
/ 27 января 2012

Я не думаю, что это возможно.Если вы посмотрите на источник aliases метода , вы увидите, что он создает новый хеш при каждом вызове, а псевдонимы копируются во внутреннее представление.

Из чегоЯ вижу, что не похоже, что есть какой-либо способ изменить эти внутренние данные из программы Ruby.

Возможно, вам просто нужно проверить строку, полученную из PayPal, прежде чем пытаться использовать ее в качестве кодировки.

0 голосов
/ 27 января 2012

Вы можете ввести новое определение Encoding.aliases. Это может или не может быть полезно для ваших целей: я не знаю, будет ли это подхвачено другими классами; должно, но не может.

Encoding.instance_eval <<__END
    alias :orig_aliases :aliases
    def aliases
        orig_aliases.update("x-mac-greek" => "macGreek")
    end
__END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...