2011-03-01 49 views
3
#!/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 

「utf-8」是否以這種方式編碼,將我的代碼點自動修復爲最後一個可交換代碼點(第一個平面)?關於「utf-8」行爲的問題

回答

7

查看Encode文檔的UTF-8 vs. utf8 vs. UTF8 section

總之,Perl有兩種​​不同的UTF-8編碼。它的本地編碼稱爲utf8,基本上允許任何代碼點,而不管Unicode標準對該代碼點的描述如何。

另一編碼稱爲utf-8(又名utf-8-strict)。這隻允許Unicode標準分配的代碼點。

\x{FFFF}根據Unicode不是有效的代碼點。但Perl的utf8編碼並不關心這一點。

默認情況下,encode函數用替代字符替換目標字符集中不存在的任何字符(請參閱Handling Malformed Data section)。對於utf-8,該替換字符是U+FFFD (REPLACEMENT CHARACTER),它以UTF-8編碼爲11101111 10111111 10111101(二進制)。

+0

根據Unicode,U + FFFF不是一個有效的代碼點,這是**不正確**。當然如此;交換隻是非法的。 **這些*是非常*不同的東西。**這個錯誤已在最近的開發版本中得到解決,允許'perl -wE'說「\ x {FFFF}」=〜/ ^。 0''產生1,沒有任何窺視。 – tchrist 2011-03-07 17:18:14