@@ -20,7 +20,7 @@ use version;
2020
2121# version '...'
2222our $version = ' 0.10' ;
23- our $VERSION = ' v0.1.5 ' ;
23+ our $VERSION = ' v0.1.6 ' ;
2424$VERSION = eval $VERSION ;
2525
2626# authority '...'
@@ -396,7 +396,7 @@ BEGIN {
396396 $WriteConsoleOutputCharacterA = Win32::API::More-> new(' kernel32' ,
397397 ' BOOL WriteConsoleOutputCharacterA(
398398 HANDLE hConsoleOutput,
399- LPVOID lpCharacter,
399+ LPCSTR lpCharacter,
400400 DWORD nLength,
401401 DWORD dwWriteCoord,
402402 LPDWORD lpNumberOfCharsWritten
@@ -3493,11 +3493,9 @@ sub WriteConsoleOutputCharacterA { # $|undef ($handle, $buffer, \%coord, \$wr
34933493 ;
34943494 # Convert the Perl internal string (UTF-8) to an ANSI string if necessary
34953495 $buffer = Encode::ANSI::encode($buffer , Win32::GetConsoleOutputCP());
3496- use Devel::Peek;
3497- Dump $buffer ;
34983496 my $r = UNICODE
3499- ? $WriteConsoleOutputCharacterA -> Call($handle , $buffer ,
3500- bytes:: length ( $buffer ), COORD::pack ($coord ), $$written = 0)
3497+ ? $WriteConsoleOutputCharacterA -> Call($handle , $buffer , length ( $buffer ),
3498+ COORD::pack ($coord ), $$written = 0)
35013499 : do {
35023500 Win32::SetLastError(0);
35033501 $$written = Win32::Console::_WriteConsoleOutputCharacter($handle ,
@@ -3846,35 +3844,44 @@ sub COORD::unpack ($) { # @ ($)
38463844# return the encoded multibyte (ANSI) version.
38473845#
38483846# B<Note>: Only converts if C<$str> has UTF-8 characters, otherwise it is
3849- # already ANSI compatible.
3847+ # already ANSI compatible. The returned string does not have the UTF8 flag set.
38503848sub Encode ::ANSI::encode { # $ansi ($str, |$codepage)
38513849 my ($str , $cpi ) = @_ ;
38523850 $cpi ||= CP_ACP;
3853- if ($cpi != CP_UTF8 && $str =~ / [\xC0 -\xf7 ]/ ) {
3854- my $err = Win32::GetLastError(); # Encode may set $^E
3855- my $wide = Encode::encode(' UTF-16LE' , $str );
3856- Win32::SetLastError($err );
3857- my $ansi = _WideCharToMultiByte($wide , $cpi );
3858- return $ansi if defined $ansi ;
3851+ if ($str =~ / [\xC0 -\xf7 ]/ ) {
3852+ if ($cpi != CP_UTF8) {
3853+ my $err = Win32::GetLastError(); # Encode may set $^E
3854+ my $wide = Encode::encode(' UTF-16LE' , $str );
3855+ Win32::SetLastError($err );
3856+ my $ansi = _WideCharToMultiByte($wide , $cpi );
3857+ return $ansi if defined $ansi ;
3858+ }
3859+ _utf8_off($str );
3860+ Win32::SetLastError(0);
38593861 }
38603862 return $str ;
38613863}
38623864
38633865# Decode the ANSI string into a Perl string using the system code page or
38643866# C<$codepage>, if specified.
38653867#
3866- # B<Note>: If the code page is CP_UTF8, no conversion takes place.
3868+ # B<Note>: If the code page is CP_UTF8, no conversion takes place, but the UTF8
3869+ # flag may be set.
38673870sub Encode ::ANSI::decode { # $str ($ansi, |$codepage)
38683871 my ($ansi , $cpi ) = @_ ;
38693872 $cpi ||= CP_ACP;
3870- if ($cpi != CP_UTF8 && $ansi =~ / [^\x00 -\x7f ]/ ) {
3871- my $wide = _MultiByteToWideChar($ansi , $cpi );
3872- if (defined $wide ) {
3873- my $err = Win32::GetLastError(); # Encode may set $^E
3874- my $str = Encode::decode(' UTF-16LE' , $wide );
3875- Win32::SetLastError($err );
3876- return $str ;
3873+ if ($ansi =~ / [^\x00 -\x7f ]/ ) {
3874+ if ($cpi != CP_UTF8) {
3875+ my $wide = _MultiByteToWideChar($ansi , $cpi );
3876+ if (defined $wide ) {
3877+ my $err = Win32::GetLastError(); # Encode may set $^E
3878+ my $str = Encode::decode(' UTF-16LE' , $wide );
3879+ Win32::SetLastError($err );
3880+ return $str ;
3881+ }
38773882 }
3883+ _utf8_on($ansi );
3884+ Win32::SetLastError(0);
38783885 }
38793886 return $ansi ;
38803887}
@@ -4191,14 +4198,14 @@ sub _utf8_off ($) {
41914198sub _MultiByteToWideChar { # $wstr|undef ($str, |$cp)
41924199 my ($str , $cp ) = @_ ;
41934200 return undef unless defined $str ;
4201+ return ' ' unless $str ;
41944202 $cp = CP_ACP unless defined $cp ;
4195- my $len = bytes::length ($str ) || return ' ' ;
4196- _utf8_off($str );
4197- Win32::SetLastError(0);
4198- my $wlen = $MultiByteToWideChar -> Call($cp , 0, $str , $len , undef , 0)
4203+ my $raw = bytes::substr ($str , 0);
4204+ my $len = bytes::length ($raw );
4205+ my $wlen = $MultiByteToWideChar -> Call($cp , 0, $raw , $len , undef , 0)
41994206 || return undef ;
42004207 my $wide = " \0 " x (2 * $wlen );
4201- my $r = $MultiByteToWideChar -> Call($cp , 0, $str , $len , $wide , $wlen )
4208+ my $r = $MultiByteToWideChar -> Call($cp , 0, $raw , $len , $wide , $wlen )
42024209 || return undef ;
42034210 return $wide ;
42044211}
@@ -4225,8 +4232,6 @@ sub _WideCharToMultiByte { # $str|undef ($wstr, |$cp)
42254232 $str , $len , undef , undef );
42264233 }
42274234 substr ($str , $len ) = ' ' ;
4228- _utf8_on($str ) if $cp == CP_UTF8;
4229- Win32::SetLastError(0);
42304235 return $str ;
42314236}
42324237
0 commit comments