UnicodeとIO::Handleで問題が発生したと思います。私が何か間違ったことをしている可能性が非常に高いです。IO :: Handleから個々のUnicode文字(バイトではなく)を取得および取得解除したい。しかし、私は驚くべきエラーを受け取っています。
#!/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.
ungetc()行からのエラーメッセージは、「unicode.plの21行目でUTF-8文字の形式が正しくありません(文字列の予期しない終わり)です。」\x{00c5}
「unicode.plの21行目でutf8にマップされません。」しかし、それはキャラクターの正しいヘクスであり、キャラクターにマップする必要があります。
16進エディターを使用して、A-RINGのバイトがUTF-8に対して正しいことを確認しました。
これは、2バイトの文字では問題になるようです。
最後のsayは'\xC5'(文字通り4文字:バックスラッシュ、x、C、5)を出力します。
そして、スカラー変数の代わりにファイルから読み取ることでこれをテストしました。結果は同じです。
これは、darwin-2level用に構築されたperl 5、バージョン16、subversion 2(v5.16.2)です。
そして、スクリプトはUTF-8に保存されます。それが私が最初にチェックしたことでした。