我想我遇到了 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。” 但这是字符的正确十六进制,它应该映射到字符。
我使用十六进制编辑器来确保 A-RING 的字节对于 UTF-8 是正确的。
这似乎是任何两字节字符的问题。
最后的输出'\xC5'(字面意思是四个字符:反斜杠,x,C,5)。
我已经通过从文件而不是标量变量中读取来测试了这一点。结果是一样的。
这是为 darwin-2level 构建的 perl 5,版本 16,subversion 2 (v5.16.2)
并且脚本以 UTF-8 保存。这是我检查的第一件事。