这三个版本的行为有何不同?
use open qw( :encoding(UTF-8) :std );
use open qw( :encoding(UTF8) :std );
use open qw( :utf8 :std );
答案 0 :(得分:8)
首先,:utf8
仅将文本标记为UTF-8,但不检查它是否有效。有关信息,请参阅this post on PerlMonks。
:encoding
是PerlIO的扩展层,perl perldoc perliol
“:encoding”使用编码; 使这个图层可用,虽然PerlIO.pm“知道”在哪里找到它。它是一个层的一个例子,它接受一个参数,因为它被调用:open($ fh,“<:encoding(iso-8859-7)”,$ pathname);
其他两个问题在常见问题perldoc perlunifaq
“:encoding”和“:utf8”有什么区别?因为UTF-8是Perl的内部格式之一,您通常可以跳过编码或解码步骤,并操纵直接UTF8标志。您可以简单地使用“:utf8”代替“:encoding(UTF-8)”,如果数据已在内部表示为UTF8,则会跳过编码步骤。这在您编写时被广泛认为是良好的行为,但在读取时可能会很危险,因为当您有无效的字节序列时会导致内部不一致。使用“:utf8”进行输入有时会导致安全漏洞,因此请使用“:encoding(UTF-8)”代替。您可以使用“_utf8_on”和“_utf8_off”代替“解码”和“编码”,但这被认为是糟糕的风格。特别是“_utf8_on”可能是危险的,因为“:utf8”可以。 oneliners有一些捷径;见perlrun中的“-C”。
“UTF-8”和“utf8”有什么区别?“UTF-8”是官方标准。 “utf8”是Perl在接受它时所采取的自由主义的方式。如果你必须与那些不那么自由的东西进行交流,你可能要考虑使用“UTF-8”。如果你必须与过于自由的事物进行沟通,你可能必须使用“utf8”。完整的解释是在Encode中。 “UTF-8”在内部称为“utf-8-strict”。该教程始终如一地使用UTF-8,即使在内部实际使用utf8的情况下也是如此,因为这种区别很难实现,而且几乎无关紧要。例如,utf8可用于Unicode中不存在的代码点,如9999999,但如果将其编码为UTF-8,则会获得替换字符(默认情况下,请参阅编码中的“处理格式错误的数据”以获取更多信息)解决这个问题的方法。)好的,如果你坚持:“内部格式”是utf8,而不是UTF-8。 (当它不是其他编码时。)
open
pragma(即use open
)仅设置输入和输出的默认PerlIO层; :std
执行以下操作,
“:std”subpragma本身没有任何效果,但如果与“:utf8”或“:encoding”子编号结合使用,它会转换标准文件句柄(STDIN,STDOUT,STDERR)以符合所选的编码输入/输出句柄。例如,如果输入和输出都选择为“:encoding(utf8)”,则“:std”表示STDIN,STDOUT和STDERR也在“:encoding(utf8)”中。另一方面,如果仅选择输出为“:encoding(koi8r)”,则“:std”将仅使STDOUT和STDERR处于“koi8r”中。 “:locale”subpragma隐式启用“:std”。
所以:std
是一个subpragma(特定于open.pm),它将标准流设置为接收Unicode输入perl :utf8
,如上所述。
答案 1 :(得分:2)
uft8::all
,“打开Unicode - 所有这些”。