]> git.donarmstrong.com Git - perltidy.git/commitdiff
encode error output in utf8 when -utf8 flag is set
authorSteve Hancock <perltidy@users.sourceforge.net>
Mon, 20 Jan 2020 16:20:13 +0000 (08:20 -0800)
committerSteve Hancock <perltidy@users.sourceforge.net>
Mon, 20 Jan 2020 16:20:13 +0000 (08:20 -0800)
CHANGES.md
lib/Perl/Tidy.pm
lib/Perl/Tidy/Logger.pm

index ee0a50e5e02e3cf4ca6ca3ce7dc9cbf62ee87f22..d1e3421285643b29b3414fe0ae5098ece410a6b3 100644 (file)
@@ -2,6 +2,8 @@
 
 ## 2020 01 10.01
 
+    - When -utf8 is used, any error output is encoded as utf8
+
     - Fix for git#19, adjust line break around an 'xor'
 
     - Fix for git#18, added warning for missing comma before unknown bare word.
index 0aae0404f2188007bd5cf7d34ccaf513c0031220..ef9d53242336a8c7f9976ced72a9e9f370e77a05 100644 (file)
@@ -131,7 +131,13 @@ sub streamhandle {
     # object               object
     #                      (check for 'print' method for 'w' mode)
     #                      (check for 'getline' method for 'r' mode)
-    my ( $filename, $mode ) = @_;
+
+    # An optional flag $character_encoding may be given.
+    # The current options are:
+    # 1. '' or 'none' -> the file will not use binary encoding
+    # 2. 'utf8' -> the file will be utf8 encoded
+    # 3. Any other string: use simple binmode
+    my ( $filename, $mode, $character_encoding ) = @_;
 
     my $ref = ref($filename);
     my $New;
@@ -140,10 +146,10 @@ sub streamhandle {
     # handle a reference
     if ($ref) {
         if ( $ref eq 'ARRAY' ) {
-            $New = sub { Perl::Tidy::IOScalarArray->new(@_) };
+            $New = sub { Perl::Tidy::IOScalarArray->new( $filename, $mode ) };
         }
         elsif ( $ref eq 'SCALAR' ) {
-            $New = sub { Perl::Tidy::IOScalar->new(@_) };
+            $New = sub { Perl::Tidy::IOScalar->new( $filename, $mode ) };
         }
         else {
 
@@ -198,12 +204,29 @@ EOM
             $New = sub { $mode eq 'w' ? *STDOUT : *STDIN }
         }
         else {
-            $New = sub { IO::File->new(@_) };
+            $New = sub { IO::File->new( $filename, $mode ) };
         }
     }
     $fh = $New->( $filename, $mode )
       or Warn("Couldn't open file:$filename in mode:$mode : $!\n");
 
+    if ( $fh && $character_encoding && $character_encoding ne 'none' ) {
+
+        if ( $character_encoding eq 'utf8' ) {
+            if ( ref($fh) eq 'IO::File' ) {
+                $fh->binmode(":raw:encoding(UTF-8)");
+            }
+            elsif ( $fh eq '-' ) {
+                binmode STDOUT, ":raw:encoding(UTF-8)";
+            }
+        }
+
+        # Patch for RT 122030
+        elsif ( ref($fh) eq 'IO::File' ) { $fh->binmode(); }
+
+        elsif ( $fh eq '-' ) { binmode STDOUT }
+    }
+
     return $fh, ( $ref or $filename );
 }
 
index d71be2b6a57d686ea6435ad660ce45f35044d2cb..4c872b9970020660c9b165a8f89c60928b478c56 100644 (file)
@@ -316,7 +316,8 @@ sub warning {
         if ( !$fh_warnings ) {
             my $warning_file = $self->{_warning_file};
             ( $fh_warnings, my $filename ) =
-              Perl::Tidy::streamhandle( $warning_file, 'w' );
+              Perl::Tidy::streamhandle( $warning_file, 'w',
+                $rOpts->{'character-encoding'} );
             $fh_warnings or Perl::Tidy::Die("couldn't open $filename $!\n");
             Perl::Tidy::Warn("## Please see file $filename\n")
               unless ref($warning_file);
@@ -501,7 +502,8 @@ sub finish {
 
     if ($save_logfile) {
         my $log_file = $self->{_log_file};
-        my ( $fh, $filename ) = Perl::Tidy::streamhandle( $log_file, 'w' );
+        my ( $fh, $filename ) = Perl::Tidy::streamhandle( $log_file, 'w',
+            $rOpts->{'character-encoding'} );
         if ($fh) {
             my $routput_array = $self->{_output_array};
             foreach ( @{$routput_array} ) { $fh->print($_) }
@@ -513,4 +515,3 @@ sub finish {
     return;
 }
 1;
-