sid*_*com 3 unicode perl encode utf-8
#!/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
Run Code Online (Sandbox Code Playgroud)
"utf-8"是否以这种方式编码,将我的代码点自动修复到最后一个可互换的代码点(第一个平面)?
见UTF8与UTF8与UTF8部分中的 编码文档.
总而言之,Perl有两种不同的UTF-8编码.它的本机编码被调用utf8,并且基本上允许任何代码点,无论Unicode标准对该代码点的描述如何.
另一种编码称为utf-8(aka utf-8-strict).这仅允许由Unicode标准分配的代码点.
\x{FFFF}根据Unicode,它不是有效的代码点.但是Perl的utf8编码并不关心这一点.
默认情况下,该encode函数使用替换字符替换目标字符集中不存在的任何字符(请参阅处理格式错误的数据部分).因为utf-8,该替换字符是U + FFFD(REPLACEMENT CHARACTER),其以UTF-8编码为11101111 10111111 10111101(二进制).