如何在Perl中禁用隐式解码(“升级”)?

时间:2012-11-02 03:19:25

标签: perl unicode encoding utf-8 character-encoding

引用Perl Unicode常见问题"What if I don't decode?"

  

每当编码的二进制字符串与文本一起使用时   字符串,Perl将假设你的二进制字符串是用   ISO-8859-1,也称为拉丁-1。如果它不是latin-1,那么你的   数据被不愉快地转换。例如,如果它是UTF-8,那么   多字节字符的单个字节被视为单独的   字符,然后再次转换为UTF-8。这种双重编码   可以与双HTML编码(& amp; gt;)或双URI进行比较   编码(%253E)。

     

这种无声隐式解码称为“升级”。   这可能听起来很积极,但最好避免它。

禁用此隐式解码会强制程序员正确使用decode() / encode()并帮助防止错误。

是否可以关闭隐式解码?理想情况下,将二进制字符串与文本字符串一起使用会导致错误。

1 个答案:

答案 0 :(得分:2)

我讨厌那段话。 Perl从不使用iso-8859-1隐式解码字符串。对于初学者来说,Perl无法知道字符串是否已被解码。

请考虑以下事项:

my $num_apples = 4;
my $num_vegetables = $num_apples;

Perl是否隐含地将水果转化为蔬菜?没有!那么,为什么你会说它在下面使用iso-8859-1进行了隐式解码?

my $bytes = "\x61\x62\x63\xE9";
$bytes =~ /♠/;

在第一个片段中,您将所谓的苹果视为蔬菜。在第二个片段中,您将所谓的字节视为unicode代码点。

如果你有一个需要Unicode字符串的函数,那么你传递

"\x61\x62\x63\xE9"

,它将被视为“abcé”,因为Unicode代码点0x61是“a”,Unicode代码点0x62是“b”等。不会发生解码。也许你使用

得到了这个字符串
decode('UTF-8', "\x61\x62\x63\xC3\xA9");

decode('iso-8859-1', "\x61\x62\x63\xE9");

但也许您根本没有使用decode,而只是以

开头
"\x61\x62\x63\xE9"

read($bin_fh, $buf, 4)

这并不意味着Perl隐式解码了任何东西。由于没有发生隐式解码,因此无法将其关闭。答案是否定的。