Perl 我可以从utf8::的返回关闭吗?utf8是否设置了STDIN的解码层?

Perl 我可以从utf8::的返回关闭吗?utf8是否设置了STDIN的解码层?,perl,stdin,decoding,Perl,Stdin,Decoding,是否可以这样说:如果从STDIN读取的字符串通过utf8::Is_utf8检查返回true,则设置了STDIN的解码层 #!/usr/bin/env perl use warnings; use strict; use 5.10.0; use open qw( :std :utf8 ); my $in = <STDIN>; say utf8::is_utf8( $in ) ? 'YES' : 'NO'; # YES binmode STDIN, ':bytes'; $in

是否可以这样说:如果从
STDIN
读取的字符串通过
utf8::Is_utf8
检查返回true,则设置了
STDIN
的解码层

#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.0;
use open qw( :std :utf8 );

my $in = <STDIN>;
say utf8::is_utf8( $in ) ? 'YES' : 'NO';    # YES

binmode STDIN, ':bytes';
$in = <STDIN>;
say utf8::is_utf8( $in ) ? 'YES' : 'NO';    # No

binmode STDIN, ':encoding(latin1)';
$in = <STDIN>;
say utf8::is_utf8( $in ) ? 'YES' : 'NO';    # YES
#/usr/bin/env perl
使用警告;
严格使用;
使用5.10.0;
使用开放式qw(:标准:utf8);
我的$in=;
说utf8::是不是“是”:“否”;#对
binmode标准输入':字节';
$in=;
说utf8::是不是“是”:“否”;#不
binmode标准输入:编码(拉丁1);
$in=;
说utf8::是不是“是”:“否”;#对

is_utf8
函数(无论是来自
utf8
还是来自
Encode
)只是告诉您字符串是否设置了内部
utf8
标志。这在很大程度上是您所说的结果,它包含您自己,并且与有效的UTF-8非常不同

如果您想检查文件句柄的功能,那么您应该查看该模块。像这样的电话

query_handle(*STDIN, 'utf8')
如果句柄支持UTF-8,则通过设置
:utf8
:encoding(utf8)
,将返回true

如果要专门检查
:编码(utf8)
,则需要

query_handle(*STDIN, 'layer', 'encoding')
但请注意,这将仅显示是否存在任何类型的
:encoding()
层,可以是
:encoding(iso-8859-1)

如果您真的需要检查哪个编码已就位,我知道的唯一方法是检查同一模块中
get_layers
的返回值。它返回与句柄上有效的PerlIO层对应的数组列表。像这样的

(
  ["unix",     undef,  ["CANREAD", "OPEN"]],
  ["encoding", "utf8", ["FASTGETS", "CANREAD", "LINEBUF", "UTF8"]],
)

is_utf8
函数(无论是来自
utf8
还是来自
Encode
)只是告诉您字符串是否设置了内部
utf8
标志。这在很大程度上是您所说的结果,它包含您自己,并且与有效的UTF-8非常不同

如果您想检查文件句柄的功能,那么您应该查看该模块。像这样的电话

query_handle(*STDIN, 'utf8')
如果句柄支持UTF-8,则通过设置
:utf8
:encoding(utf8)
,将返回true

如果要专门检查
:编码(utf8)
,则需要

query_handle(*STDIN, 'layer', 'encoding')
但请注意,这将仅显示是否存在任何类型的
:encoding()
层,可以是
:encoding(iso-8859-1)

如果您真的需要检查哪个编码已就位,我知道的唯一方法是检查同一模块中
get_layers
的返回值。它返回与句柄上有效的PerlIO层对应的数组列表。像这样的

(
  ["unix",     undef,  ["CANREAD", "OPEN"]],
  ["encoding", "utf8", ["FASTGETS", "CANREAD", "LINEBUF", "UTF8"]],
)

is_utf8
函数(无论是来自
utf8
还是来自
Encode
)只是告诉您字符串是否设置了内部
utf8
标志。这在很大程度上是您所说的结果,它包含您自己,并且与有效的UTF-8非常不同

如果您想检查文件句柄的功能,那么您应该查看该模块。像这样的电话

query_handle(*STDIN, 'utf8')
如果句柄支持UTF-8,则通过设置
:utf8
:encoding(utf8)
,将返回true

如果要专门检查
:编码(utf8)
,则需要

query_handle(*STDIN, 'layer', 'encoding')
但请注意,这将仅显示是否存在任何类型的
:encoding()
层,可以是
:encoding(iso-8859-1)

如果您真的需要检查哪个编码已就位,我知道的唯一方法是检查同一模块中
get_layers
的返回值。它返回与句柄上有效的PerlIO层对应的数组列表。像这样的

(
  ["unix",     undef,  ["CANREAD", "OPEN"]],
  ["encoding", "utf8", ["FASTGETS", "CANREAD", "LINEBUF", "UTF8"]],
)

is_utf8
函数(无论是来自
utf8
还是来自
Encode
)只是告诉您字符串是否设置了内部
utf8
标志。这在很大程度上是您所说的结果,它包含您自己,并且与有效的UTF-8非常不同

如果您想检查文件句柄的功能,那么您应该查看该模块。像这样的电话

query_handle(*STDIN, 'utf8')
如果句柄支持UTF-8,则通过设置
:utf8
:encoding(utf8)
,将返回true

如果要专门检查
:编码(utf8)
,则需要

query_handle(*STDIN, 'layer', 'encoding')
但请注意,这将仅显示是否存在任何类型的
:encoding()
层,可以是
:encoding(iso-8859-1)

如果您真的需要检查哪个编码已就位,我知道的唯一方法是检查同一模块中
get_layers
的返回值。它返回与句柄上有效的PerlIO层对应的数组列表。像这样的

(
  ["unix",     undef,  ["CANREAD", "OPEN"]],
  ["encoding", "utf8", ["FASTGETS", "CANREAD", "LINEBUF", "UTF8"]],
)


我会谨慎地得出这样的结论。All
utf8::is\u utf8
真正告诉您Perl是否认为它是内部utf8编码的,这也恰好与latin1编码和输入有关,如示例的最后几行所示。它不知道它是如何得到字符串的,也不知道其他地方对它做了什么。您真正想要实现的是什么?我想知道是否设置了
binmode STDIN':encoding(…)
。如果设置了,我将让返回一个子程序解码字符串,否则返回未解码字符串。您是专门询问
,还是询问一般的标量?(必须走了,但稍后会回来。)这是用于中的
readline
方法。到目前为止,该方法中的编码/解码对我很有效,但我不知道我是否测试得足够好。@sid_com:如果您的情况很复杂,那么您可能希望直接使用模块的功能,而不是隐式地使用
readline
,我会谨慎地得出这样的结论。All
utf8::is\u utf8
真正告诉您Perl是否认为它是utf8编码的inte