【问题标题】:Win32::Console: InputChar and codepage 65001Win32::Console: InputChar 和代码页 65001
【发布时间】:2014-07-15 20:02:37
【问题描述】:

当我在活动代码页为 65001 的 Windows 控制台中运行此脚本时,如果我输入 ö (U+00F6),InputChar 将返回 undef。这是否意味着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.
{}

【问题讨论】:

  • 对于没有必要语言键盘但希望进行测试的人,请按住Alt 并在键盘上输入148

标签: perl winapi input console codepages


【解决方案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比较了解

【讨论】:

    【解决方案2】:

    我会对libwin32(其中Win32::Console 是其中的一部分)非常谨慎,因为它最后一次更新是在六年前,在 Windows Vista 的早期。

    您可能想尝试Win32::Unicode::Console,它具有非常不同的 API,但专为您的目的而设计。

    【讨论】:

    • 我没有找到像InputChar 这样的东西。
    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 2011-09-28
    • 2021-06-03
    • 2017-02-05
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多