3

这三个版本的行为是否都不同?

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

2 回答 2

8

首先,:utf8仅将文本标记为 UTF-8,它不检查它是否有效。有关信息,请参阅PerlMonks 上的这篇文章

:encoding是 PerlIO 的扩展层,perlperldoc perliol

":encoding" 使用编码;使该层可用,尽管 PerlIO.pm “知道”在哪里可以找到它。这是一个层的例子,它接受一个参数,因为它被称为: open( $fh, "<:encoding(iso-8859-7)", $pathname );

其他两个问题在常见问题解答中得到解答perldoc perlunifaq

":encoding" 和 ":utf8" 有什么区别?因为 UTF-8 是 Perl 的内部格式之一,您通常可以跳过编码或解码步骤,直接操作 UTF8 标志。代替 ":encoding(UTF-8)",您可以简单地使用 ":utf8",如果数据在内部已经表示为 UTF8,它会跳过编码步骤。这在您写作时被广泛接受为良好的行为,但在阅读时可能很危险,因为当您有无效的字节序列时它会导致内部不一致。使用 ":utf8" 输入有时会导致安全漏洞,因此请改用 ":encoding(UTF-8)"。您可以使用“_utf8_on”和“_utf8_off”来代替“decode”和“encode”,但这被认为是不好的风格。尤其是 "_utf8_on" 可能很危险,原因与 ":

“UTF-8”和“utf8”有什么区别?“UTF-8”是官方标准。“utf8”是 Perl 在接受的内容方面自由的方式。如果您必须与不那么自由的事物进行通信,您可能需要考虑使用“UTF-8”。如果你必须与过于自由的东西交流,你可能不得不使用“utf8”。完整的解释在编码中。“UTF-8”在内部称为“utf-8-strict”。本教程始终使用 UTF-8,即使内部实际使用了 utf8,因为这种区别可能很难区分,而且大多是无关紧要的。例如,utf8 可用于 Unicode 中不存在的代码点,如 9999999,但如果将其编码为 UTF-8,则会得到一个替换字符(默认情况下;有关更多信息,请参阅编码中的“处理格式错误的数据”处理这个问题的方法。)好的,如果您坚持:“内部格式”是 utf8,而不是 UTF-8。(当它不是其他编码时。)

openpragma(即use open)只为输入和输出设置默认的 PerlIO层;:std执行以下操作,

":std" 子编译指示本身没有效果,但如果与 ":utf8" 或 ":encoding" 子编译指示结合使用,它会转换标准文件句柄(STDIN、STDOUT、STDERR)以符合为输入/输出选择的编码手柄。例如,如果输入和输出都选择为 ":encoding(utf8)",则 ":std" 将意味着 STDIN、STDOUT 和 STDERR 也在 ":encoding(utf8)" 中。另一方面,如果只选择输出在 ":encoding(koi8r)" 中,":std" 将导致只有 STDOUT 和 STDERR 在 "koi8r" 中。":locale" 子编译指示隐式打开 ":std"。

:std如上所述,将标准流设置为接收 Unicode 输入 perl 的 subpragma(特定于 open.pm)也是如此:utf8

于 2013-01-28T16:43:15.793 回答
2

埃文似乎有你的答案。对于未来的易用性,请参阅uft8::all开启 Unicode - 全部”

于 2013-01-28T19:03:58.547 回答