coolmichael has asked for the wisdom of the Perl Monks concerning the following question:
#!/usr/local/bin/perl use 5.016; use utf8; use strict; use warnings; binmode(STDIN, ':encoding(utf-8)'); binmode(STDOUT, ':encoding(utf-8)'); binmode(STDERR, ':encoding(utf-8)'); my $string = qq[a Å]; my $fh = IO::File->new(); $fh->open(\$string, '<:encoding(UTF-8)'); say $fh->getc(); # a say $fh->getc(); # SPACE say $fh->getc(); # Å LATIN CAPITAL LETTER A WITH RING ABOVE (U+00C5) $fh->ungetc(ord("Å")); say $fh->getc(); # should be A RING again.
The error message from the ungetc() line is "Malformed UTF-8 character (unexpected end of string) in say at unicode.pl line 21. "\x{00c5}" does not map to utf8 at unicode.pl line 21." But that's the correct hex for the character, and it should map to the character.
I used a hex editor to make sure that the bytes for A-RING are correct for UTF-8.
This seems to be a problem for any two-byte character.
The final say outputs '\xC5' (literally four characters: backslash, x, C, 5)
And I've tested this by reading from files instead of scalar variables. The result is the same.
This is perl 5, version 16, subversion 2 (v5.16.2) built for darwin-2level
Edited to add: And the script is saved in UTF-8. That was the first thing I checked.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: IO::Handle Unicode and ungetc()
by quester (Vicar) on Jan 06, 2013 at 06:28 UTC | |
|
Re: IO::Handle Unicode and ungetc()
by Leon Timmermans (Acolyte) on Jan 09, 2013 at 21:42 UTC | |
|
Re: IO::Handle Unicode and ungetc()
by Anonymous Monk on Jan 06, 2013 at 07:53 UTC | |
by coolmichael (Deacon) on Jan 07, 2013 at 03:22 UTC |