UTF-8 Date_Init fix

databind
vitalif 2009-03-25 17:20:51 +00:00 committed by Vitaliy Filippov
parent 5c758bd9b0
commit 2484e03bba
1 changed files with 37 additions and 8 deletions

View File

@ -26,7 +26,7 @@ our @EXPORT_OK = qw(
HASHARRAY quotequote min max trim htmlspecialchars strip_tags strip_unsafe_tags
file_get_contents dbi_hacks ar1el filemd5 mysql_quote updaterow_hashref
insertall_hashref deleteall_hashref dumper_no_lf str2time callif urandom
normalize_url utf8on mysql2time mysqllocaltime
normalize_url utf8on rfrom_to mysql2time mysqllocaltime
);
our %EXPORT_TAGS = (all => [ @EXPORT_OK ]);
@ -452,18 +452,20 @@ sub dumper_no_lf
# str2time, принимающий формат даты вида DD.MM.YYYY
my $init;
my $orig_DIRussian;
sub str2time
{
my ($str) = @_;
my $time;
my $codeset = langinfo(CODESET());
Date_Init(@DATE_INIT), $init = 1 unless $init;
Encode::_utf8_on($str) if $codeset =~ /utf-?8/iso;
unless ($init)
{
$orig_DIRussian = \&Date::Manip::_Date_Init_Russian;
*Date::Manip::_Date_Init_Russian = \&date_init_russian;
Date_Init(@DATE_INIT);
$init = 1;
}
$str = lc $str;
$time = $str;
Encode::_utf8_off($time);
Encode::from_to($time, $codeset, "koi8-r");
$time = UnixDate(ParseDate($time),"%s");
$time = UnixDate(ParseDate($str),"%s");
return $time if defined $time;
$time = $str;
$time =~ s/(\d{2})\.(\d{2})\.(\d{4})/$2\/$1\/$3/gso;
@ -471,6 +473,15 @@ sub str2time
return $time;
}
sub date_init_russian
{
my $r = &$orig_DIRussian(@_);
rfrom_to($_[0], 'koi8-r', 'utf-8');
utf8on($_[0]);
$_[0]->{month_abb}->[1]->[2] = 'мар';
return $r;
}
# если значение - вернуть значение, если coderef - вызвать и вернуть значение
sub callif
{
@ -569,5 +580,23 @@ sub mysqllocaltime
return ();
}
# рекурсивная версия from_to
sub rfrom_to
{
if (ref($_[0]) && $_[0] =~ /HASH/so)
{
rfrom_to($_[0]->{$_}, $_[1], $_[2]) for keys %{$_[0]};
}
elsif (ref($_[0]) && $_[0] =~ /ARRAY/so)
{
rfrom_to($_, $_[1], $_[2]) for @{$_[0]};
}
else
{
Encode::from_to($_[0], $_[1], $_[2]);
}
return $_[0];
}
1;
__END__