Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Допустимые символы.


Автор: Dima85 6.10.2009, 13:18
Я отсеиваю все потанциально ненужные и опасные символы таким образом:
$messages=~s/[^ .,\\*$%@()~_!?:;\/a-zA-Zа-яА-ЯЁё0-9[\]_-]+//g;

Но почему в итоге получаю непонятные символы? Тоесть некоторые буквы такие как "р", "т" пишуться как �:
Идея п�ивле�� по�ен�иал�н�� клиен�ов �азмес�и�� �еклам� на сай�е.

Автор: b00 6.10.2009, 16:55
Кодировку скрипта и кодировку входа проверяли? use encoding?

Автор: gcc 6.10.2009, 17:41
Dima85

Код

 use Encode;
           $messages = Encode::decode('utf8', $_);

$messages=~s/[^ .,\\*$%@()~_!?:;\/a-zA-Zа-яА-ЯЁё0-9[\]_-]+//g;
    
          $messages = Encode::encode('utf8', $_ );

Автор: Dima85 6.10.2009, 20:51
Да, везде UTF-8
Когда нет этой фильтрации, все работает хорошо.

Автор: arto 6.10.2009, 21:25
use utf8

Автор: gcc 7.10.2009, 06:22
Dima85, то что я написал не работает? 

Автор: Dima85 7.10.2009, 13:02
Извените что отвечаю так долго. Пытался разобраться сам, перепроверил все кодировки еще раз, везде Dos/Windows формат - UTF-8.

Впервые с таким встречаюсь. На вывод тоже стит:
print "Content-type: text/html; charset=UTF-8\n\n";

Теперь что касаеться предложенных способов.
gcc, ваш способ с  use Encode почему-то не сработал. Ошибок нет. Но и выводить текст с переменной $messages он вообще отказываеться.

arto, use utf8 тоже не помог.

Возможно поможет отрывок кода:

Код

#!/usr/bin/perl
use CGI qw(param);
use strict;
#use CGI::Carp qw/fatalsToBrowser/;
use Fcntl ':flock'; # блок файлов
use Net::SMTP;    # Подключаем модуль SMTP.

##############################################################
my($directory)= $ENV{'SCRIPT_FILENAME'}; # смотрим путь где находится скрипт
$directory=~s/\\/\//gis; # если есть \ меняим их на /
$directory=~s/[^\\\/]+$//is; # стираем название нашего скрипта
$directory=~s/\/cgi-bin\//\//gis; # стираем папку cgi-bin
$directory.="data"; # папка куда сохраняются все записи
##############################################################

my $username = param("username");
my $email = param("email");
my $total = param("total");
my $messages = param("messages");

$username=substr($username,0,25);
$email=substr($email,0,25);
$total =substr($total,0,25);
$messages=substr($messages,0,2000);

$username=~s/[^ a-zA-Zа-яА-Я@().0-9_-]+//g;
$email=~s/[^a-zA-Zа-яА-Я@().0-9_-]+//g;
$total=~s/[^a-zA-Zа-яА-Я().0-9_-]+//g;
$messages=~s/\r\n/ /g; #Работа с Enter <br>
$messages=~s/[^ .\\*$%@()~_!?:;\/a-zA-Zа-яА-ЯЁё0-9[\]_-]+//g;

print "Content-type: text/html; charset=UTF-8\n\n";

***

Далее идет отправка на e-mail, сохранение в файл (в котором и появляються нечитабельные символы) и вывод на экнар текста что все прошло удачьно - что тоже странно он выводиться нормально.

Может я как-то неправельно сохраняю, выкладываю код:

Код

***
  open(LOG, ">>$directory/orders.csv") or die "Can't open file $!\n";
  flock(LOG, LOCK_EX); #назапись
  print LOG "\r\n$messages,$ENV{REMOTE_ADDR}";
  close(LOG) or die "Can't close file $!\n";

***


Спасибо.

Автор: gcc 7.10.2009, 13:08
Код

 use Encode;
           $messages = Encode::decode('utf8', $messages);
$messages=~s/[^ .,\\*$%@()~_!?:;\/a-zA-Zа-яА-ЯЁё0-9[\]_-]+//g;
    
          $messages = Encode::encode('utf8', $messages );

Автор: Dima85 7.10.2009, 13:25
gcc, латиница и цыфры записываються в файл но вся кирилица стираеться.

Насчет $_ и  $messages, да действительно в моем случае нужно было заменить $_ на $messages, сам почему-то не додумался.

Но в итоге как и раньше - не работает.

Автор: ginnie 7.10.2009, 13:37
Dima85, можно попробовать

Код

use utf8;
use open OUT => ':utf8';

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