Perl Win32::Console::ANSI和uri\u unescape

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::

当我使用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::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