这三个版本的行为都不一样吗?
use open qw( :encoding(UTF-8) :std );
use open qw( :encoding(UTF8) :std );
use open qw( :utf8 :std );
Run Code Online (Sandbox Code Playgroud)
首先,:utf8只将文本标记为UTF-8,它不会检查它是否有效.有关信息,请参阅PerlMonks上的这篇文章.
:encoding 是PerlIO的扩展层,perl perldoc perliol
":encoding"使用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编译指示(即,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,如上所述.
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |