Perl Win32::Console::ANSI和uri\u unescape
当我使用CP850在WinXP终端中运行此脚本时,Perl Win32::Console::ANSI和uri\u unescape,perl,winapi,terminal,escaping,Perl,Winapi,Terminal,Escaping,当我使用CP850在WinXP终端中运行此脚本时,Ü和ö显示正确。当我取消注释时,使用Win32::Console::ANSI行输出中断。 这是预期的行为还是一个bug #!perl use warnings; use strict; use 5.10.0; binmode STDOUT, ':encoding(cp850)'; use Encode qw(decode_utf8); use URI::Escape qw(uri_unescape); #use Win32::Console::
Ü
和ö
显示正确。当我取消注释时,使用Win32::Console::ANSI代码>行输出中断。
这是预期的行为还是一个bug
#!perl
use warnings;
use strict;
use 5.10.0;
binmode STDOUT, ':encoding(cp850)';
use Encode qw(decode_utf8);
use URI::Escape qw(uri_unescape);
#use Win32::Console::ANSI;
my $uri_escaped = '%C3%9Cberraschungsei+R%C3%B6ntgen';
say $uri_escaped;
my $uri_unescaped = uri_unescape( $uri_escaped );
say $uri_unescaped;
my $utf8_decoded = decode_utf8( $uri_unescaped );
say "Result: $utf8_decoded";
启用时:
使用ANSI代码页(cp1252)而不是OEM代码页
>chcp
Active code page: 437
>perl a.pl cp437
%C3%9Cberraschungsei+R%C3%B6ntgen
Überraschungsei+Röntgen
>perl -MWin32::Console::ANSI a.pl cp1252
%C3%9Cberraschungsei+R%C3%B6ntgen
Überraschungsei+Röntgen
为什么cp850会破坏uri\u escape
的输出uri_escape
未被使用,uri_escape
(%C3%9CBerrashungsei+R%C3%B6ntgen
)的结果正确显示,因为它完全由US-ASCII字符组成。我把它搞混了-我的意思是为什么它会破坏uri_unescape
的结果。它根本没有uri_unescape
两次返回完全相同的内容。对于您使用的工具,uri\u unescape
返回的文本编码不正确,从而中断了输出。Thx!出于某种原因,我没有用Devel::Peek
检查字符串。
%C3%9Cberraschungsei+R%C3%B6ntgen
"\x{009c}" does not map to cp850 at C:perl.pl line 15.
Ç\x{009c}berraschungsei+RÇôntgen
Result: sberraschungsei+R"ntgen
>chcp
Active code page: 437
>perl a.pl cp437
%C3%9Cberraschungsei+R%C3%B6ntgen
Überraschungsei+Röntgen
>perl -MWin32::Console::ANSI a.pl cp1252
%C3%9Cberraschungsei+R%C3%B6ntgen
Überraschungsei+Röntgen