Forum Webscript.Ru

Программирование => Perl => Тема начата: grinder от 02 Сентября 2002, 07:56:13

Название: Проблема с кодировкой
Отправлено: 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. Как это сделать?
Название: Проблема с кодировкой
Отправлено: Serchey от 02 Сентября 2002, 09:03:07
Зачит так. Если ты желаешь видеть свои стр-ци в кои, тогда используй
Ну а если хочешь заниматся перекодировкой, вот тебе фирменный модуль(пан сам склёпав):
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";
Название: Проблема с кодировкой
Отправлено: SteelRat от 07 Сентября 2002, 04:16:18
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)
Название: Проблема с кодировкой
Отправлено: grinder от 10 Сентября 2002, 23:45:12
За модуль спасибо, работает. Только правда дома. Файлы модулей должны лежать не в любом каталоге, а в тех, которые определены в @INC. Так ведь? На хостинге у меня нет доступа к папке, в которой ищутся модули. Можно как-нибудь эти пути переопределить?
Название: Проблема с кодировкой
Отправлено: glebushka от 11 Сентября 2002, 00:20:15
Цитировать
Так ведь?

Угу.
Цитировать
Можно как-нибудь эти пути переопределить?

скинь модуль в папку скрипта, а в самом скрипте:
use lib qw(.);
Название: Проблема с кодировкой
Отправлено: glebushka от 11 Сентября 2002, 00:20:49
ну и модуль подключить не забудь:-)
Название: Проблема с кодировкой
Отправлено: SteelRat от 11 Сентября 2002, 00:21:00
#В начало скрипта:
use lib \'/home/fatal/t/thewebfactory/cgi-bin/BonchForum/lib\'; #Полный(желательно) путь к папке.
#И кладёшь в неё модуль.
Название: Проблема с кодировкой
Отправлено: glebushka от 11 Сентября 2002, 00:23:24
Цитировать
use lib \'/home/fatal/t/thewebfactory/cgi-bin/BonchForum/lib\'; #Полный(желательно)

лучше всё-таки вместе со скриптом, а то в этом случае при переезде схостинга придётс яскрипт редактировать, а ещё у хостера могут пути измениться, хотя это маловероятно:-)
Название: Проблема с кодировкой
Отправлено: grinder от 11 Сентября 2002, 00:28:20
Спасибо.