UTF8-Flags setzen/beachten
authorSven Schöling <s.schoeling@linet-services.de>
Tue, 20 Jul 2010 11:14:50 +0000 (13:14 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Tue, 20 Jul 2010 11:14:50 +0000 (13:14 +0200)
Conflicts:

SL/ReportGenerator.pm

SL/Locale.pm
SL/ReportGenerator.pm
SL/SEPA/XML.pm
SL/SEPA/XML/Transaction.pm
SL/Template.pm

index 05f55ce..28b13c6 100644 (file)
 
 package Locale;
 
-use Text::Iconv;
+use Encode;
 use List::Util qw(first);
+use List::MoreUtils qw(any);
 
 use SL::LXDebug;
 use SL::Common;
+use SL::Iconv;
 use SL::Inifile;
 
 use strict;
@@ -88,12 +90,18 @@ sub _init {
   }
 
   my $db_charset            = $main::dbcharset || Common::DEFAULT_CHARSET;
+  $self->{is_utf8}          = (any { lc($::dbcharset || '') eq $_ } qw(utf8 utf-8 unicode)) ? 1 : 0;
 
-  $self->{iconv}            = Text::Iconv->new($self->{charset}, $db_charset);
-  $self->{iconv_reverse}    = Text::Iconv->new($db_charset,      $self->{charset});
-  $self->{iconv_english}    = Text::Iconv->new('ASCII',          $db_charset);
-  $self->{iconv_iso8859}    = Text::Iconv->new('ISO-8859-15',    $db_charset);
-  $self->{iconv_to_iso8859} = Text::Iconv->new($db_charset,      'ISO-8859-15');
+  if ($self->{is_utf8}) {
+    binmode STDOUT, ":utf8";
+    binmode STDERR, ":utf8";
+  }
+
+  $self->{iconv}            = SL::Iconv->new($self->{charset}, $db_charset);
+  $self->{iconv_reverse}    = SL::Iconv->new($db_charset,      $self->{charset});
+  $self->{iconv_english}    = SL::Iconv->new('ASCII',          $db_charset);
+  $self->{iconv_iso8859}    = SL::Iconv->new('ISO-8859-15',    $db_charset);
+  $self->{iconv_to_iso8859} = SL::Iconv->new($db_charset,      'ISO-8859-15');
 
   $self->_read_special_chars_file($country);
 
@@ -105,6 +113,12 @@ sub _init {
     (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec));
 }
 
+sub is_utf8 {
+  my $self   = shift;
+  my $handle = shift;
+  return $self->{is_utf8} && (!$handle || $handle->is_utf8);
+}
+
 sub _handle_markup {
   my $self    = shift;
   my $str     = shift;
@@ -406,4 +420,14 @@ sub remap_special_chars {
   return $self->quote_special_chars($dst_format, $self->quote_special_chars("${src_format}-reverse", shift));
 }
 
+sub with_raw_io {
+  my $self = shift;
+  my $fh   = shift;
+  my $code = shift;
+
+  binmode $fh, ":raw";
+  $code->();
+  binmode $fh, ":utf8" if $self->is_utf8;
+}
+
 1;
index e23bf77..e593a5e 100644 (file)
@@ -1,11 +1,9 @@
 package SL::ReportGenerator;
 
 use Data::Dumper;
-use Encode;
 use IO::Wrap;
 use List::Util qw(max);
 use Text::CSV_XS;
-use Text::Iconv;
 #use PDF::API2;    # these two eat up to .75s on startup. only load them if we actually need them
 #use PDF::Table;
 
@@ -235,7 +233,9 @@ sub generate_with_headers {
     my $filename = $self->get_attachment_basename();
     print qq|content-type: text/csv\n|;
     print qq|content-disposition: attachment; filename=${filename}.csv\n\n|;
-    $self->generate_csv_content();
+    $::locale->with_raw_io(\*STDOUT, sub {
+      $self->generate_csv_content();
+    });
 
   } elsif ($format eq 'pdf') {
     $self->generate_pdf_content();
@@ -410,15 +410,6 @@ sub _cm2bp {
   return $_[0] * 72 / 2.54;
 }
 
-sub _decode_text {
-  my $self = shift;
-  my $text = shift;
-
-  $text    = decode('UTF-8', $text) if ($self->{text_is_utf8});
-
-  return $text;
-}
-
 sub generate_pdf_content {
   eval {
     require PDF::API2;
@@ -440,8 +431,7 @@ sub generate_pdf_content {
   my $num_columns     = scalar @visible_columns;
   my $num_header_rows = 1;
 
-  my $font_encoding     = $main::dbcharset || 'ISO-8859-15';
-  $self->{text_is_utf8} = $font_encoding =~ m/^utf-?8$/i;
+  my $font_encoding   = $main::dbcharset || 'ISO-8859-15';
 
   foreach my $name (@visible_columns) {
     push @column_props, { 'justify' => $self->{columns}->{$name}->{align} eq 'right' ? 'right' : 'left' };
@@ -456,7 +446,7 @@ sub generate_pdf_content {
     foreach my $name (@visible_columns) {
       my $column = $self->{columns}->{$name};
 
-      push @{ $data_row },       $self->_decode_text($column->{text});
+      push @{ $data_row },       $column->{text};
       push @{ $cell_props_row }, {};
     }
 
@@ -470,7 +460,7 @@ sub generate_pdf_content {
       push @cell_props, $cell_props_row;
 
       foreach my $custom_header_col (@{ $custom_header_row }) {
-        push @{ $data_row }, $self->_decode_text($custom_header_col->{text});
+        push @{ $data_row }, $custom_header_col->{text};
 
         my $num_output  = ($custom_header_col->{colspan} * 1 > 1) ? $custom_header_col->{colspan} : 1;
         if ($num_output > 1) {
@@ -488,7 +478,7 @@ sub generate_pdf_content {
   foreach my $row_set (@{ $self->{data} }) {
     if ('HASH' eq ref $row_set) {
       if ($row_set->{type} eq 'colspan_data') {
-        push @data, [ $self->_decode_text($row_set->{data}) ];
+        push @data, [ $row_set->{data} ];
 
         $cell_props_row = [];
         push @cell_props, $cell_props_row;
@@ -512,7 +502,7 @@ sub generate_pdf_content {
       my $col_idx = 0;
       foreach my $col_name (@visible_columns) {
         my $col = $row->{$col_name};
-        push @{ $data_row }, $self->_decode_text(join("\n", @{ $col->{data} || [] }));
+        push @{ $data_row }, join("\n", @{ $col->{data} || [] });
 
         $column_props[$col_idx]->{justify} = 'right' if ($col->{align} eq 'right');
 
@@ -583,7 +573,7 @@ sub generate_pdf_content {
   my $top_text_height   = 0;
 
   if ($self->{options}->{top_info_text}) {
-    my $top_text     =  $self->_decode_text($self->{options}->{top_info_text});
+    my $top_text     =  $self->{options}->{top_info_text};
     $top_text        =~ s/\r//g;
     $top_text        =~ s/\n+$//;
 
@@ -631,7 +621,7 @@ sub generate_pdf_content {
     my $curpage  = $pdf->openpage($page_num);
 
     if ($pdfopts->{number}) {
-      my $label    = $self->_decode_text($main::locale->text("Page #1/#2", $page_num, $pdf->pages()));
+      my $label    = $main::locale->text("Page #1/#2", $page_num, $pdf->pages());
       my $text_obj = $curpage->text();
 
       $text_obj->font($font, $font_size);
@@ -640,7 +630,7 @@ sub generate_pdf_content {
     }
 
     if ($opts->{title}) {
-      my $title    = $self->_decode_text($opts->{title});
+      my $title    = $opts->{title};
       my $text_obj = $curpage->text();
 
       $text_obj->font($font, $title_font_size);
@@ -671,7 +661,9 @@ sub generate_pdf_content {
     print qq|content-type: application/pdf\n|;
     print qq|content-disposition: attachment; filename=${filename}.pdf\n\n|;
 
-    print $content;
+    $::locale->with_raw_io(\*STDOUT, sub {
+      print $content;
+    });
   }
 }
 
@@ -700,10 +692,9 @@ sub _print_content {
 sub unescape_string {
   my $self  = shift;
   my $text  = shift;
-  my $iconv = $main::locale->{iconv};
 
   $text     = $main::locale->unquote_special_chars('HTML', $text);
-  $text     = $main::locale->{iconv}->convert($text) if ($main::locale->{iconv});
+  $text     = $::locale->{iconv}->convert($text);
 
   return $text;
 }
index ee45536..ddac25e 100644 (file)
@@ -8,9 +8,9 @@ use Encode;
 use List::Util qw(first sum);
 use List::MoreUtils qw(any);
 use POSIX qw(strftime);
-use Text::Iconv;
 use XML::Writer;
 
+use SL::Iconv;
 use SL::SEPA::XML::Transaction;
 
 sub new {
@@ -34,12 +34,12 @@ sub _init {
 
   map { $self->{$_} = $params{$_} if (exists $params{$_}) } qw(src_charset company message_id grouped);
 
-  $self->{iconv} = Text::Iconv->new($self->{src_charset}, "UTF-8") || croak "Unsupported source charset $self->{src_charset}.";
+  $self->{iconv} = SL::Iconv->new($self->{src_charset}, "UTF-8") || croak "Unsupported source charset $self->{src_charset}.";
 
   my $missing_parameter = first { !$self->{$_} } qw(company message_id);
   croak "Missing parameter: $missing_parameter" if ($missing_parameter);
 
-  map { $self->{$_} = $self->_replace_special_chars(decode('UTF-8', $self->{iconv}->convert($self->{$_}))) } qw(company message_id);
+  map { $self->{$_} = $self->_replace_special_chars($self->{iconv}->convert($self->{$_})) } qw(company message_id);
 }
 
 sub add_transaction {
index 8849b41..be444af 100644 (file)
@@ -6,7 +6,6 @@ use Carp;
 use Encode;
 use List::Util qw(first);
 use POSIX qw(strftime);
-use Text::Iconv;
 
 sub new {
   my $class = shift;
@@ -34,9 +33,9 @@ sub _init {
 
   croak "Execution date format wrong for '$params{execution_date}': not YYYY-MM-DD." if ($params{execution_date} !~ /^\d{4}-\d{2}-\d{2}$/);
 
-  map { $self->{$_} = decode('UTF-8', $self->{sepa}->{iconv}->convert($params{$_})) } keys %params;
-  map { $self->{$_} =~ s/\s+//g                                                     } qw(src_iban src_bic dst_iban dst_bic);
-  map { $self->{$_} = $self->{sepa}->_replace_special_chars($self->{$_})            } qw(recipient reference end_to_end_id);
+  map { $self->{$_} = $self->{sepa}->{iconv}->convert($params{$_})       } keys %params;
+  map { $self->{$_} =~ s/\s+//g                                          } qw(src_iban src_bic dst_iban dst_bic);
+  map { $self->{$_} = $self->{sepa}->_replace_special_chars($self->{$_}) } qw(recipient reference end_to_end_id);
 }
 
 sub get {
index 7f4d275..f767967 100644 (file)
@@ -838,9 +838,12 @@ sub parse {
 
 package OpenDocumentTemplate;
 
+use Archive::Zip;
 use POSIX 'setsid';
 use vars qw(@ISA);
 
+use SL::Iconv;
+
 use Cwd;
 # use File::Copy;
 # use File::Spec;
@@ -856,19 +859,8 @@ sub new {
 
   my $self = $type->SUPER::new(@_);
 
-  foreach my $module (qw(Archive::Zip Text::Iconv)) {
-    eval("use ${module};");
-    if ($@) {
-      $self->{"form"}->error("The Perl module '${module}' could not be " .
-                             "loaded. Support for OpenDocument templates " .
-                             "does not work without it. Please install your " .
-                             "distribution's package or get the module from " .
-                             "CPAN ( http://www.cpan.org ).");
-    }
-  }
-
   $self->{"rnd"}   = int(rand(1000000));
-  $self->{"iconv"} = Text::Iconv->new($main::dbcharset, "UTF-8");
+  $self->{"iconv"} = SL::Iconv->new($main::dbcharset, "UTF-8");
 
   $self->set_tag_style('&lt;%', '%&gt;');
   $self->{quot_re} = '&quot;';