2

引用 Perl Unicode FAQ “如果我不解码怎么办?”

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

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

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

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

4

1 回答 1

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 隐含地解码了任何东西。由于没有发生隐式解码,因此无法将其关闭。答案是不。

于 2012-11-02T03:45:20.473 回答