Возможно, это поможет. От Perl Programming/Unicode UTF-8:
По умолчанию CGI.pm не расшифровывает ваши параметры формы. Вы можете использовать прагму -utf8
, которая будет обрабатывать (и декодировать) все параметры как строки UTF-8, но это не удастся, если у вас есть загрузка двоичного файла . Лучшее решение включает в себя переопределение метода паров: (пример следующий)
[Неправильный - см Коррекции] Вот documentation for the utf-8
pragma. Поскольку загрузка двоичных данных, по-видимому, не вызывает у вас беспокойства, использование прагмы utf-8
представляется наиболее простым.
Исправление: Per комментарий от @Slaven, не следует путать общую Perl utf8
прагму с -utf-8
pragma, который был определен для использования с CGI.pm
:
-utf8
Это делает CGI .pm обрабатывать все параметры как строки UTF-8. Используйте это с заботой , так как это будет мешать обработке бинарных загрузок. Это лучше вручную выбрать, какие поля должны вернуться в UTF-8 строк и конвертировать их с помощью кода, как это:
use Encode;
my $arg = decode utf8=>param('foo');
Follow Up: duleshi, вы спросите: Но я до сих пор дон Не понимаю различия между декодированием в Encode и utf8 :: decode. Как отличаются модули Encode и utf8?
Из документации для utf8 pragma:
Обратите внимание, что эта функция не обрабатывает произвольные кодировки. Поэтому Кодировка рекомендуется для общих целей; см. также Encode.
Другими словами, Encode
модуль работает с многих различных кодировок (включая UTF-8), в то время как utf8
функции работают только с кодировкой UTF-8.
Вот программа Perl, которая демонстрирует эквивалентность двух подходов к кодированию и декодированию UTF-8. (Также см live demo.)
#!/usr/bin/perl
use strict;
use warnings;
use utf8; # allows 'ñ' to appear in the source code
use Encode;
my $word = "Español"; # the 'ñ' is permitted because of the 'use utf8' pragma
# Convert the string to its UTF-8 equivalent.
my $utf8_word = Encode::encode("UTF-8", $word);
# Use 'utf8::decode' to convert the string back to internal form.
my $word_again_via_utf8 = $utf8_word;
utf8::decode($word_again_via_utf8); # converts in-place
# Use 'Encode::decode' to convert the string back to internal form.
my $word_again_via_Encode = Encode::decode("UTF-8", $utf8_word);
# Do the two conversion methods produce the same result?
# Prints 'Yes'.
print $word_again_via_utf8 eq $word_again_via_Encode ? "Yes\n" : "No\n";
# Do we get back the original internal string after converting both ways?
# Prints 'Yes'.
print $word eq $word_again_via_Encode ? "Yes\n" : "No\n";
Документация pragma в utf-8 гласит: «Не используйте эту прагму для чего-либо еще, кроме как говорить Perl о том, что ваш скрипт написан в UTF-8». Так что здесь это не нужно. –
@ Славен - Спасибо за руководство ... пожалуйста, посмотрите мою коррекцию. – DavidRR
Я думаю, что реальным виновником могут быть настройки разрешения, что является причиной многих ошибок для новичков CGI, таких как я. Это выходные, поэтому я не проверял его. Во всяком случае, ваш ответ очень полезен. Благодаря! Но я до сих пор не понимаю разницы между декодированием в Encode и utf8 :: decode. Как отличаются модули Encode и utf8? – duleshi