2014-07-15 37 views
0

當我在活動代碼頁爲65001的Windows控制檯中運行此腳本時,如果輸入ö(U + 00F6),則返回undef。這是否意味着InputChar不適用於cp65001Win32 :: Console:InputChar和codepage 65001

#!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. 
{} 
+1

對人沒有必要的語言鍵盤得到AöBöCöDö10到程序誰希望測試這個,按住'Alt'並在*鍵盤上輸入'148' * – Borodin

回答

1

如果你看裏面的子InputChar你可以看到它使用_ReadConsole不這樣做的unicode(我認爲的char *不是Unicode)

它也不會做的,因爲這樣 ReadConsole function (Windows) Unicode是叫,至少那是什麼文件暗示對我:)

更新: OTOH,如果我編輯的Win32控制檯-0.10 \ Makefile.PL添加

DEFINE  => ' -DUNICODE ', 

和TH恩重新編譯/重新安裝的Win32 ::控制檯,我可以使用下面的

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; 
    } 
} 

你應該報告給作者,HES更瞭解win32的

-1

我會非常謹慎libwin32(其中Win32::Console是其中的一部分),因爲它是最後六年前更新,在Windows Vista的初期階段。

你可能想嘗試Win32::Unicode::Console它有一個非常不同的API,但是是爲你的目的而設計的。

+0

我沒有找到像'InputChar'這樣的東西。 –