morgon has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I can do this to print a unicode-string to a file:

use strict; use Encode; use utf8; my $string = "üö&auml"; open my $fh, ">:encoding(UTF-8)", $file or die $!; print $fh $in;
This works as expected.

However when I try to add the encoding layer to STDOUT it does not seem to work:

use strict; use Encode; use utf8; my $string = "üö&auml"; binmode STDOUT, ">:encoding(UTF-8)"; print $string;
Redirecting this script's output to a file results in a latin1-encoded file.

Why is that?

Many thanks!

Replies are listed 'Best First'.
Re: printing unicode to STDOUT
by ikegami (Patriarch) on Feb 02, 2011 at 17:05 UTC

    [ I'm assuming the HTML entities (e.g. «ü») are really the represented character («ü») encoded using UTF-8 in your source. ]

    Remove the ">". That tells open how to open the file. binmode is choking on it.

    binmode STDOUT, ":encoding(UTF-8)"; print $s;
    use open ':std', ':encoding(UTF-8)'; # binmodes STD* print $s;

    By the way, «use Encode;» is not required here.

Re: printing unicode to STDOUT
by Anonyrnous Monk (Hermit) on Feb 02, 2011 at 17:16 UTC

    With warnings on, you'd have gotten

    Invalid separator character '>' in PerlIO layer specification

    :)

Re: printing unicode to STDOUT
by elef (Friar) on Feb 02, 2011 at 19:20 UTC
    As noted above, my $string = "&uuml;&ouml;&auml"; makes the string contain literally ampersand-u-u-m-l-semicolon etc. Your script says use utf8; already, so you can use literal unicode characters in it, or chr(XXXX) if you want to be extra safe. If you just used character entities here for fear that perlmonks will corrupt your accented characters, well, obviously, the character entities don't get translated if they are in <code> tags.

    On another note, I can't see you OS mentioned here. If you're on *nix, your characters will probably show up correctly in the console without fooling with the encodings at all. If you're on Windows, you might not be able to get them to show up correctly, whatever you do. Maybe you can get it to work on your own computer, but if you want it to work on any windows box of unknown localization, you're in for an uphill struggle.