Получение строк параметров запроса UTF-8 в mod_perl2 - PullRequest
0 голосов
/ 01 декабря 2010

Я использую mod_perl2 для веб-сайта и использую CGI :: Apache2 :: Wrapper, чтобы получить параметры запроса для страницы (например, данные публикации). Я заметил, что строка, которую возвращает функция $ req-> param ("parameter"), не является UTF-8. Если я использую строку как есть, я могу получить искаженные результаты, поэтому мне нужно декодировать ее, используя Encode :: decode_utf8 (). Есть ли какой-либо способ получить параметры, уже декодированные в строки UTF-8, или пройти через параметры и безопасно их декодировать?

1 Ответ

1 голос
/ 02 декабря 2010

Чтобы получить уже декодированные параметры, нам нужно переопределить поведение базового класса Apache2::Request из libapreq2 , тем самым потеряв преимущество в скорости XS. Но это даже не просто возможно, поскольку, к сожалению, мы саботируем конструктор CGI::Apache2::Wrapper:

unless (defined $r and ref($r) and ref($r) eq 'Apache2::RequestRec') {

Это неправильное ОО-программирование, оно должно сказать

… $r->isa('Apache2::RequestRec')

или, возможно, вообще отказаться от имен классов и просто проверить поведение (… $r->can('param')).

Я говорю, с этими препятствиями оно того не стоит. Я рекомендую сохранить существующее решение, которое явно декодирует параметры. Это достаточно ясно.

Чтобы перебрать параметры запроса, просто не передавайте аргумент методу param, и вы получите список имен. Это задокументировано ( 1 , 2 ), пожалуйста, прочитайте более внимательно.

...