Revision cbd1249e
Von Sven Schöling vor fast 14 Jahren hinzugefügt
SL/Iconv.pm | ||
---|---|---|
6 | 6 |
|
7 | 7 |
use SL::Common; |
8 | 8 |
|
9 |
use vars qw(%converters);
|
|
9 |
my %converters;
|
|
10 | 10 |
|
11 | 11 |
use strict; |
12 | 12 |
|
... | ... | |
23 | 23 |
my ($from_charset, $to_charset) = @_; |
24 | 24 |
|
25 | 25 |
my $index = join $SUBSCRIPT_SEPARATOR, $from_charset, $to_charset; |
26 |
$converters{$index} ||= SL::Iconv->new($from_charset, $to_charset);
|
|
26 |
$converters{$index} ||= Text::Iconv->new($from_charset, $to_charset) || die;
|
|
27 | 27 |
|
28 | 28 |
return $converters{$index}; |
29 | 29 |
} |
... | ... | |
44 | 44 |
my $self = shift; |
45 | 45 |
my $text = shift; |
46 | 46 |
|
47 |
$text = $self->{handle}->convert($text) if !$self->{to_is_utf8} || !Encode::is_utf8($text);
|
|
48 |
$text = decode("utf-8-strict", $text) if $self->{to_is_utf8} && !Encode::is_utf8($text); |
|
47 |
$text = convert($self->{from}, $self->{to}, $text) if !$self->{to_is_utf8} || !Encode::is_utf8($text);
|
|
48 |
$text = decode("utf-8-strict", $text) if $self->{to_is_utf8} && !Encode::is_utf8($text);
|
|
49 | 49 |
|
50 | 50 |
return $text; |
51 | 51 |
} |
... | ... | |
56 | 56 |
$self->{to} = shift; |
57 | 57 |
$self->{to} = 'UTF-8' if lc $self->{to} eq 'unicode'; |
58 | 58 |
$self->{to_is_utf8} = $self->{to} =~ m/^utf-?8$/i; |
59 |
$self->{handle} = Text::Iconv->new($self->{from}, $self->{to}) || die; |
|
60 | 59 |
|
61 | 60 |
return $self; |
62 | 61 |
} |
Auch abrufbar als: Unified diff
Iconv Handle cachen.
Text::Iconv ist sloppy programmiert und leakt bei FCGI Anwendungen etwa 1MB pro
grossem Request. Das entsprechende Ticket [1] ist 3 Jahre alt, und es ist nicht
damit zu rechnen, dass das in nächster Zeit behoben wird.
Die Handle werden jetzt sortiert gecachet und im Klassenraum vorgehalten, so
dass der Overhead für die Iconv Objekte abschätzbar bei 4,4kb pro Encoding
Kombination ist.
[1] https://rt.cpan.org/Public/Bug/Display.html?id=31101