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

如何在Perl中禁用隐式解码(“升级”)?,perl,unicode,encoding,utf-8,character-encoding,Perl,Unicode,Encoding,Utf 8,Character Encoding,引用Perl Unicode常见问题解答 无论何时编码,二进制字符串都与文本一起使用 字符串,Perl将假定您的二进制字符串是用 ISO-8859-1,也称为拉丁语-1。如果不是拉丁语-1,那么你的 数据被不愉快地转换。例如,如果是UTF-8,则 多字节字符的各个字节被视为独立的 字符,然后再次转换为UTF-8。这种双重编码 可以与双HTML编码(&;gt;)或双URI进行比较 编码(%253E) 这种无声隐式解码称为“升级”。 这听起来可能是积极的,但最好避免 禁用此隐式解码将迫使程序员

引用Perl Unicode常见问题解答

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

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

禁用此隐式解码将迫使程序员正确使用
decode()
/
encode()
,并有助于防止错误


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

我讨厌那篇文章。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");

但也许你根本没有使用
解码
,只是从

"\x61\x62\x63\xE9"


这并不意味着Perl隐式地解码了任何东西。因为没有隐式解码发生,所以不可能关闭它。答案是否定的。

检测到这种问题是可能的,但是Perl需要开始为字符串分配意义:文本vs字节vs未知。然后,如果需要文本的func得到字节,它可能会发出警告或死亡。
"\x61\x62\x63\xE9"
read($bin_fh, $buf, 4)