
Смена кодировки сайта на perl'e с window-1251 на utf8
1. Надо перекодировать базу данных. Это делается в линухе так:
mysqldump -ulogin -ppassword --default-character-set=cp1251 dbname > ./dbname1251.sql iconv -f windows-1251 -t utf-8 ./dbname1251.sql > ./dbname_utf8.sql mysql -ulogin -ppassword dbname --default-character-set=utf8 <./dbname_utf8.sql
Мне больше понравилось конвертировать sql-файл скриптом, вместо iconv:
#!perl # use strict; use lib "../../lib"; use cyrillic qw (detect convert); my %encode = ( 'win' => 'utf' ); my %change = ( 'cp1251' => 'utf8' ); $/ = undef; ParseFile("./db_param.sql"); sub ParseFile() { my $file = shift; if ( -f $file ) { open my $fh, "<", $file or die "can't read file $file: $!"; my $content = <$fh>; close $fh; #die detect( $content); # if ( detect($content) eq "1251" ) { while(my ($k, $v)=each %change) { $content =~ s/\Q$k/$v/gs; } print "Converting: $file\n"; convert( 'win', 'utf', \$content ); open $fh, ">", $file or die "can't read file $file: $!"; print $fh $content; close $fh; # } } }
В процессе импорта перекодированной базы у меня возникла ошибка.
ERROR 1153 (08S01) at line 1188: Got a packet bigger than 'max_allowed_packet' bytes
В windows эта же ошибка выглядела так:
ERROR 2006 (HY000) at line 1188: MySQL server has gone away
Лечится это настройкой max_allowed_packet в my.cnf:
... [mysqld] max_allowed_packet=128M
потом надо перезапустить mysql:
./mysql restart
2. Если в БД были таблицы, создержащие blob'ы, то они испротились. Их надо вытаскивать из старой базы, и если в blob'ах хранился текст в старой кодировке, то перекодировать его вручную. Либо написать скрипт.
И так, если есть таблицы с blob'ами, то надо их сключить из дампа:
mysqldump -ulogin -ppassword --default-character-set=cp1251 --ignore-table=dbname.Cr2Parameters, dbname.FUCUser, dbname.FUCIDEm dbname > ./dbname1251.sql
3. pack & unpack строк в utf8.
Возможно придется переписать вызовы unpack и pack. Подробности описаны в
perldoc perlpacktut
4. Перевести все исходники из windows-1251 в utf-8. В моем случае это русские шаблоны (файлы с расширением *.rus в папках разной вложенности), и модули perl *.pm, javascript *.js. Вот скрипт, который делает это автоматически:
#!perl # use strict; use lib "../../lib"; use cyrillic qw (detect convert); my @filemasks = ( "pm", "pl", "rus", "js" ); my %encode = ( 'win' => 'utf' ); $/ = undef; ParseDir("./"); sub ParseDir() { my $path = shift; my @files; opendir my $dh, $path; my @allfiles = readdir($dh); closedir $dh; foreach my $mask (@filemasks) { push @files, grep {(/(\.${mask})$/) && (-f "$path/$_") } @allfiles; } #die @files; ParseFile("$path/$_") foreach @files; my @dirs = grep { !(/^\./) && -d "$path/$_" } @allfiles; ParseDir ("$path/$_") foreach @dirs; } sub ParseFile() { my $file = shift; return if($file=~/utf/); if ( -f $file ) { open my $fh, "<", $file; my $content = <$fh>; close $fh; #die detect( $content); if ( detect($content) eq "1251" ) { print "Converting: $file\n"; convert( 'win', 'utf', \$content ); open $fh, ">", $file; print $fh $content; close $fh; } } }
6. при подключении к БД:
$encoding="utf8"; $dbh->do("SET NAMES '".$encoding."'"); $dbh->do("SET CHARACTER SET '".$encoding."'");
7. HTTP RESPONSE:
$encoding="utf-8"; print "Content-type: text/html;charset=".$encoding;
8. .htaccess
AddDefaultCharset utf-8
9. поискать в исходниках, если где-то что-то конвертировалось из 1251 в utf, закомментировать, например так:
#!/usr/bin/perl # use strict; my @filemasks=("*.pm","*.pl"); my %change=("convert" => "#convert; my $file; my ($k, $v); $/=undef; foreach (@filemasks) { next if($_=~/repl.pl/); print "Prepare filemask: $_\n"; foreach $file (glob $_) { print "Prepare file: $file\n"; open my $fh, "<", $file; my $content=<$fh>; close $fh; while(($k, $v)=each %change) { $content =~ s/\Q$k/$v/gs; } open $fh, ">", $file; print $fh $content; close $fh; } }