Win32 :: Console:InputChar和代码页65001

时间:2014-07-15 20:02:38

标签: perl winapi input console codepages

当我在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.
{}

2 个答案:

答案 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但是专为您的目的而设计。