Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Cyrrilic Chars


Автор: sonriente 13.12.2009, 21:43
Здравствуйте.

Необходимо написать простенький perl-cgi скрипт, который будет удалять все гласные буквы в веденых словах (латинские и кириллические символы).


Делаю так:

index.html

Код

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<form id="cgiform" action="cgi-bin/test" method="post">
<label for="inputbox">
Text:
</label>
<input type="text" id="inputbox" maxlength="80" />
<input type="submit" id="sendit" value="Отправить"/>
</form>
</body>
</html>



test:
Код

#!/usr/bin/perl
print "Content-type: text/html\n\n";
sysread(stdin,$data,$ENV{'CONTENT_LENGTH'});
($name,$value) = split(/=/,$data);
$value =~ s/[a|e|i|y|u|o]//g;
print $value;


До вставки кириллических символов в replace-строку даже не дошло, ибо если ввести фразу на русском, то результирующая строка будет выглядеть так:
%D0%B0%D0%B1D0%B2


Что я делаю не так? Как исправить? Как дописать replace-строку?
Помогите, пожалуйста.

OS: Mac OS 10.4.11
Server: MAMP
Perl: 5.8.1

Автор: Itsys 14.12.2009, 01:07
либо
Код

   $value =~ s/%([A-F0-9]{2})/pack("C", hex($1))/egi;


либо используй стандартную библиотеку CGI.

Автор: sonriente 14.12.2009, 02:33
Цитата(Itsys @ 14.12.2009,  01:07)
либо
Код

   $value =~ s/%([A-F0-9]{2})/pack("C", hex($1))/egi;



Крякозябры больше не отображаются, но и со строкой больше ничего не происходит т.е. она отображается в исходном виде.

Цитата(Itsys @ 14.12.2009,  01:07)

либо используй стандартную библиотеку CGI.


А можно пример, пожалуйста?

Спасибо большое.

Автор: ginnie 14.12.2009, 16:49
Цитата(sonriente @  14.12.2009,  02:33 Найти цитируемый пост)
Крякозябры больше не отображаются, но и со строкой больше ничего не происходит т.е. она отображается в исходном виде.


а что с ней должно происходить, если у Вас

Код

$value =~ s/[a|e|i|y|u|o]//g;


может если в регулярное выражение добавить кириллические символы что-то изменится?

Добавлено через 2 минуты и 46 секунд
вот пример использования модуля для получения параметров из формы:
Код

use CGI::Minimal;

my $cgi = CGI::Minimal->new;
my $form_field_value = $cgi->param('some_field_name');

Автор: sonriente 16.12.2009, 21:14
Цитата(ginnie @ 14.12.2009,  16:49)
Цитата(sonriente @  14.12.2009,  02:33 Найти цитируемый пост)
Крякозябры больше не отображаются, но и со строкой больше ничего не происходит т.е. она отображается в исходном виде.


а что с ней должно происходить, если у Вас

Код

$value =~ s/[a|e|i|y|u|o]//g;


может если в регулярное выражение добавить кириллические символы что-то изменится?

Добавлено @ 16:52
вот пример использования модуля для получения параметров из формы:
Код

use CGI::Minimal;

my $cgi = CGI::Minimal->new;
my $form_field_value = $cgi->param('some_field_name');

Добавил. СТали происходить забавности:

Введенная строка:

а
Код

ааабуебвБ


Результирующая строка:

Код

ББВ


Введенная строка:

вууууеееоооррвК

Результат:

Код

ВВ


Изначально форма в UTF-8, файл в UTF-8. 
Результирующая форма почему-то открывается в ISO-8859-5 кодировке...

Регулярное выражение следующее:

Код

$value =~ s/%[A-F0-9]{2}/pack("C",hex($1))/egi;  // то, что порекомендовали
$value =~ s/[a|e|i|o|u|y|а|е|и|о|у|ы|э|ю|я]//gi;   // то, что я добавил

Автор: ginnie 17.12.2009, 20:02
sonriente, покажите Ваш скрипт целиком. Кроме этого добавьте

Код

use Devel::Peek;


до и после замены вставьте
Код

Dump($value);


и сообщите, в какой кодировке у Вас скрипт, utf-8?

P.S. Все думал, что меня смущает в строке 

Код

$value =~ s/[a|e|i|o|u|y|а|е|и|о|у|ы|э|ю|я]//gi;


и наконец понял - знаки альтернативного поиска лишние

Код

$value =~ s/[aeiouyаеиоуыэюя]//gi;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)