Смена кодировки сайта на perl'e с window-1251 на utf8

Анастасия

Смена кодировки сайта на 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;	
    }
}

Похожие записи

Вы можете оставить
комментарий



    
© 2002-2016 Креограф. Все права защищены законом РФ
 Русский /  English