2013-12-06 3 views
2

У меня есть скрипт CGI Perl, принимающий символы Юникода в качестве одного из параметров.
URL-адрес имеет видКак использовать unicode в perl CGI param

.../worker.pl?text="some_unicode_chars"&... 

В сценарии Perl, я передаю переменную $ текста в сценарий оболочки:

system "a.sh \"$text\" out_put_file"; 

Если я жёстко текст в сценарии Perl, он работает Что ж. Тем не менее, вывод не имеет смысла, когда $ text получен из сети с использованием CGI.

my $q = CGI->new; 
my $text = $q->param('text'); 

Я подозреваю, что это вызвало проблему. uft-8 вызвал у меня столько неприятностей. Кто-нибудь, пожалуйста, помогите мне?

ответ

3

Возможно, это поможет. От 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"; 
+1

Документация pragma в utf-8 гласит: «Не используйте эту прагму для чего-либо еще, кроме как говорить Perl о том, что ваш скрипт написан в UTF-8». Так что здесь это не нужно. –

+0

@ Славен - Спасибо за руководство ... пожалуйста, посмотрите мою коррекцию. – DavidRR

+0

Я думаю, что реальным виновником могут быть настройки разрешения, что является причиной многих ошибок для новичков CGI, таких как я. Это выходные, поэтому я не проверял его. Во всяком случае, ваш ответ очень полезен. Благодаря! Но я до сих пор не понимаю разницы между декодированием в Encode и utf8 :: decode. Как отличаются модули Encode и utf8? – duleshi

1

Если вы передаете UTF-8 данные по списку параметров, то вы определенно хотите быть URI, кодирующие их с помощью URI::Escape модуля. Это преобразует любые расширенные символы в процентные значения, которые легко распечатываются и читаются. На принимающей стороне вам понадобится URI декодировать их перед продолжением.

+0

Это на самом деле то, что мы делаем сейчас. Но это означает, что нужен еще один слой. Я бы предпочел, чтобы вводить символы Unicode непосредственно в адресную строку браузера. – duleshi

+0

Это еще один слой, но правильный слой, как указано в RFC (http://tools.ietf.org/html/rfc3986#section-2). Кодировка URI охватывает не только расширенные символы, но и зарезервированные. Например, пробелы и косые черты. – chooban

Смежные вопросы