Perl 有关「;utf-8“-行为

Perl 有关「;utf-8“-行为,perl,unicode,utf-8,encode,Perl,Unicode,Utf 8,Encode,“utf-8”是否以这种方式编码,将我的代码点自动固定到(第一个平面的)最后一个可互换的代码点 请参见文档的第页 总之,Perl有两种不同的UTF-8编码。它的本机编码称为utf8,基本上允许任何代码点,而不管Unicode标准如何描述该代码点 另一种编码称为utf-8(也称为utf-8-strict)。这只允许Unicode标准指定的代码点 根据Unicode,\x{FFFF}不是有效的码点。但是Perl的utf8编码并不关心这一点 默认情况下,encode函数用替换字符替换目标字符集中不存在

“utf-8”是否以这种方式编码,将我的代码点自动固定到(第一个平面的)最后一个可互换的代码点

请参见文档的第页

总之,Perl有两种不同的UTF-8编码。它的本机编码称为
utf8
,基本上允许任何代码点,而不管Unicode标准如何描述该代码点

另一种编码称为
utf-8
(也称为
utf-8-strict
)。这只允许Unicode标准指定的代码点

根据Unicode,
\x{FFFF}
不是有效的码点。但是Perl的
utf8
编码并不关心这一点

默认情况下,
encode
函数用替换字符替换目标字符集中不存在的任何字符(请参阅)。对于
utf-8
,替换字符为,在utf-8中编码为11101111 10111111 10111101(二进制)。

根据Unicode,U+FFFF不是有效的代码点。当然是,;交换是违法的。这些是非常不同的事情。这个错误在最近的开发版本中已经修复,允许
perl-wE'say“\x{FFFF}”=~/^.$/| | 0”
生成1而不需要任何提示。
#!/usr/bin/env perl
use warnings;
use 5.012;
use Encode qw(encode);

no warnings qw(utf8);

my $c = "\x{ffff}";

my $utf_8 = encode( 'utf-8', $c );
my $utf8 = encode( 'utf8', $c );

say "utf-8 :  @{[ unpack '(B8)*', $utf_8 ]}";
say "utf8  :  @{[ unpack '(B8)*', $utf8 ]}";

# utf-8 :  11101111 10111111 10111101
# utf8  :  11101111 10111111 10111111