当我在Windows控制台中运行此脚本时活动代码页为65001 InputChar
如果我输入undef
(U + 00F6),则返回ö
。这是否意味着InputChar
无法使用cp65001
?
#!perl
use warnings;
use strict;
use 5.10.0;
use Devel::Peek;
use Win32::Console;
my $in = Win32::Console->new( STD_INPUT_HANDLE );
$in->Mode( ENABLE_PROCESSED_INPUT );
my $char = $in->InputChar();
Dump $char;
say "{$char}";
C:>chcp 65001
Active code page: 65001
C:>perl.pl
SV = NULL(0x0) at 0x12b6fac
REFCNT = 1
FLAGS = (PADMY)
Use of uninitialized value $char in concatenation (.) or string at ... line 21.
{}
答案 0 :(得分:1)
如果您查看子InputChar内部,您可以看到它使用_ReadConsole并不执行unicode(我认为char *不是unicode)
由于调用 ReadConsole function (Windows) 的方式,它也不会执行unicode,至少这是文档提示给我的内容:)
更新: OTOH,如果我编辑Win32-Console-0.10 \ Makefile.PL来添加
DEFINE => ' -DUNICODE ',
然后重新编译/重新安装Win32 :: Console,我可以使用以下内容AöBöCöDö10
进入程序
my $chars = ShInputChar( $in, 10 );
sub ShInputChar {
package Win32::Console;
my($self, $number) = @_;
return undef unless ref($self);
$number = 1 unless defined($number);
my $onumber = $number;
## double up or free to wrong pool, char versus wchar
$number = 2 * $number;
my $buffer = (" " x $number);
my $readed = _ReadConsole($self->{'handle'}, $buffer, $number) ;
my $err = sprintf "ErrSet \$!(%d)(%s)\n\$^E(%d)(%s)\n", $!,$!,$^E,$^E;
use Encode;
$buffer = Encode::decode('UTF-16LE', $buffer );
if ( $readed == $number or $onumber == $readed ) {
return $buffer;
}
else {
warn "wanted $number but read $readed returning buffer anyway";
return $buffer;
}
}
你应该向作者报告,他对win32更了解
答案 1 :(得分:-1)
我对libwin32
(其中Win32::Console
是其中的一部分)非常谨慎,因为它是在六年前的最新版本,在Windows Vista的早期。
您可能想尝试Win32::Unicode::Console
,它具有非常不同的API但是专为您的目的而设计。