【问题标题】:Win32::Console::ANSI and uri_unescapeWin32::Console::ANSI 和 uri_unescape
【发布时间】:2013-08-29 19:35:13
【问题描述】:

当我在带有 CP850 的 WinXP 终端中运行此脚本时,Üö 显示正确。当我取消注释 use Win32::Console::ANSI; 行时,输出已损坏。
这种行为是可以预期的还是这是一个错误?

#!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";

%C3%9Cberraschungsei+R%C3%B6ntgen
"\x{009c}" does not map to cp850 at C:perl.pl line 15.
Ã\x{009c}berraschungsei+Röntgen
Result: Überraschungsei+Röntgen

启用Win32::Console::ANSI

%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

【问题讨论】:

    标签: perl winapi terminal escaping


    【解决方案1】:

    使用 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_escape的输出?
    • 嗯? uri_escape 未被使用,uri_escape (%C3%9Cberraschungsei+R%C3%B6ntgen) 的结果正确显示,因为它完全由 US-ASCII 字符组成。
    • 我把它弄混了 - 我的意思是为什么它会破坏 uri_unescape 的结果。
    • 根本没有。 uri_unescape 两次返回完全相同的东西。您通过为您使用的工具错误地对uri_unescape 返回的文本进行编码来破坏输出。
    • 谢谢!出于某种原因,我没有使用Devel::Peek 检查字符串。
    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多