open pragma与不同的utf8有何不同?

时间:2013-01-28 16:23:06

标签: perl utf-8

这三个版本的行为有何不同?

use open qw( :encoding(UTF-8) :std );  
use open qw( :encoding(UTF8) :std );  
use open qw( :utf8 :std );  

2 个答案:

答案 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 - 所有这些”