Forum Webscript.Ru
Программирование => Perl => Тема начата: grinder от 02 Сентября 2002, 07:56:13
-
Гостевая книга.
Когда юзер добавляет информацию, она пишется в файл, и по идее должна эта инфа писаться в KOI8, но она пишется в win-1251. И поэтому когда эта инфа выводится в браузер то получается плохо. Весь контент в KOI8, а то что читается из файла в win-1251. Так что тексты сообщений гостевой прочитать невозможно. Пробовал писать :
print "Content-type: text/html; windows-1251\\n\\n";
не помогает.
Скрипт примерно такой (проверку ввода запрещенного вырезал):
#!/usr/local/bin/perl
print "Content-type: text/html\\n\\n";
$buffer=$ENV{\'QUERY_STRING\'};
#@pairs = split(/&/, $buffer);
@pairs = split(/\\\\&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
$NAME = "$in{name}";
$EMAIL = $in{email};
$TEXT = "$in{text}";
$DATES = $data;
open(FILE,">>guest.txt");
print FILE $NAME,"|",$EMAIL,"| |",$TEXT,"|",$DATES,"\\n";
close(FILE);
Во всех shtml, в которых потом скрипт вставляет текст из файла прописана строка:
Видимо нужно, чтобы когда информация добавляется, она писалась в файл в KOI8. Как это сделать?
-
Зачит так. Если ты желаешь видеть свои стр-ци в кои, тогда используй
Ну а если хочешь заниматся перекодировкой, вот тебе фирменный модуль(пан сам склёпав):
package Encode;
use Exporter;
@ISA = (\'Exporter\');
@EXPORT = qw(&translate);
sub new {
my $class = shift;
my $self = {};
%$self = @_;
bless($self,$class);
return $self;
}
%code = ();
$code{alt} =
"\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87".
"\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f".
"\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97".
"\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f".
"\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7".
"\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf".
"\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7".
"\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef".
"\\xf0\\xf1\\x49\\x69\\xf4\\xf5\\xf2\\xf3";
$code{koi} =
"\\xe1\\xe2\\xf7\\xe7\\xe4\\xe5\\xf6\\xfa".
"\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0".
"\\xf2\\xf3\\xf4\\xf5\\xe6\\xe8\\xe3\\xfe".
"\\xfb\\xfd\\xff\\xf9\\xf8\\xfc\\xe0\\xf1".
"\\xc1\\xc2\\xd7\\xc7\\xc4\\xc5\\xd6\\xda".
"\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0".
"\\xd2\\xd3\\xd4\\xd5\\xc6\\xc8\\xc3\\xde".
"\\xdb\\xdd\\xdf\\xd9\\xd8\\xdc\\xc0\\xd1".
"\\xb3\\xa3\\xb6\\xa6\\xb7\\xa7\\xb4\\xa4";
$code{iso} =
"\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7".
"\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf".
"\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7".
"\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf".
"\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7".
"\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf".
"\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7".
"\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef".
"\\xa1\\xf1\\xa6\\xf6\\xa7\\xf7\\xa4\\xf4";
$code{win} =
"\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7".
"\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf".
"\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7".
"\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf".
"\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7".
"\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef".
"\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7".
"\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff".
"\\xa8\\xb8\\xb2\\xb3\\xaf\\xbf\\xaa\\xba";
sub translate {
my $from = shift;
my $to = shift;
my @text = @_?@_:();
if(!(exists $code{$from}) || !(exists $code{$to})){
if(scalar(@text) == 1){return $text[0];} elsif (scalar(@text) == 0){return \'\';}
return @text;
}
foreach(@text){
eval "\\$_ =~ tr/$code{$from}/$code{$to}/";
}
if(scalar(@text) == 1){return $text[0];} elsif (scalar(@text) == 0){return \'\';}
return @text;
}
Использовать так:
#!/usr/bin/perl -w
use Encode;
$x = \'просто текст\';
$x = translate(\'koi\',\'alt\',$x); # $x = translate(\'from\',\'to\',$x) -win,iso,koi,alt
print $x,"\\n";
-
print "Content-type: text/html;charset=$locale{\'tcp_encoding\'}\\n\\n";
example:
print "Content-type: text/html;charset=koi8-r\\n\\n";
pvdlab.net - копай там cgi-lib.pl там есть функции перегонки одних русских кодировок в другие. Тоже могут пригодиться.
2Serchey:
Насколько я понимаю, не koi8-ru, а koi8-r (http://www.linux.ru.net/index.php)
-
За модуль спасибо, работает. Только правда дома. Файлы модулей должны лежать не в любом каталоге, а в тех, которые определены в @INC. Так ведь? На хостинге у меня нет доступа к папке, в которой ищутся модули. Можно как-нибудь эти пути переопределить?
-
Так ведь?
Угу.
Можно как-нибудь эти пути переопределить?
скинь модуль в папку скрипта, а в самом скрипте:
use lib qw(.);
-
ну и модуль подключить не забудь:-)
-
#В начало скрипта:
use lib \'/home/fatal/t/thewebfactory/cgi-bin/BonchForum/lib\'; #Полный(желательно) путь к папке.
#И кладёшь в неё модуль.
-
use lib \'/home/fatal/t/thewebfactory/cgi-bin/BonchForum/lib\'; #Полный(желательно)
лучше всё-таки вместе со скриптом, а то в этом случае при переезде схостинга придётс яскрипт редактировать, а ещё у хостера могут пути измениться, хотя это маловероятно:-)
-
Спасибо.