回波αβγδεζ | od -t x1 0000000 98 99 9a 9b 9c-6ren">
gpt4 book ai didi

perl - 如何在 ActiveState Perl 中获得正确的非 ASCII 命令行参数?

转载 作者:行者123 更新时间:2023-12-04 06:10:38 26 4
gpt4 key购买 nike

运行以下命令

perl -e "for (my $i = 0; $i < length($ARGV[0]); $i++) {print ord(substr($ARGV[0], $i, 1)), qq{\n}; }" αβγδεζ

在带有 ActiveState Perl v5.14.2 的 Windows 7 cmd 窗口上产生以下结果:
97
223
63
100
101
63

上面的值是无意义的,不对应于任何已知的编码,所以尝试用推荐的方法解码它们
How can I treat command-line arguments as UTF-8 in Perl?没有帮助。更改命令窗口事件代码页不会更改结果。

最佳答案

你的系统,就像我知道的每个 Windows 系统一样,默认使用 1252 ANSI 代码页,所以你可以尝试使用

use Encode qw( decode );
@ARGV = map { decode('cp1252', $_) } @ARGV;

请注意,cp1252 不能代表所有这些字符,这就是控制台和 Perl 实际接收的原因
  • 一个 97
  • ß 223
  • ? 63
  • d 100
  • 电子 101
  • ? 63

  • 有一个“宽”接口(interface)用于将(几乎)任何 Unicode 代码点传递给程序,但是
  • 当您在提示符处键入命令时,不使用 Wide 界面。
  • Perl 使用 ANSI 接口(interface)来获取参数,因此即使您使用 Wide 接口(interface)启动 Perl,当 Perl 获取参数时,参数也会降级为 ANSI。

  • 抱歉,这是一种“你不能”的情况。你需要一种不同的方法。 Diomidis Spinellis 建议在 Win7 中更改系统的 ANSI 代码页,如下所示:
  • 控制面板
  • 地区和语言
  • 行政
  • 非 Unicode 程序的语言
  • 将非 Unicode 程序的当前语言设置为与特定字符关联的语言(在您的情况下为希腊语)。

  • 此时,您将使用与新选择的编码相关联的 ANSI 代码页的编码,而不是 cp1252。 ( cp1253 表示希腊语)。
    use Encode qw( decode );
    @ARGV = map { decode('cp1253', $_) } @ARGV;

    请注意,使用 chcp修改控制台窗口中使用的代码页不会影响 Perl 接收其参数的代码页,它始终是一个 ANSI 代码页。请参阅下面的示例(cp737 是希腊语 OEM code page,cp1253 是希腊语 ANSI code page。您可以在 this document 中找到标记为 37 和 M7 的编码。)

    C:\>chcp 737
    事件代码页:737

    C:\>回波αβγδεζ | od -t x1
    0000000 98 99 9a 9b 9c 9d 20 0d 0a

    C:\>perl -e "打印映射 sprintf('%x', ord($_)), split(//, $ARGV[0])"αβγδεζ
    e1 e2 e3 e4 e5 e6

    C:\>chcp 1253
    事件代码页:1253

    C:\>回波αβγδεζ | od -t x1
    0000000 e1 e2 e3 e4 e5 e6 20 0d 0a

    C:\>perl -e "打印映射 sprintf('%x', ord($_)), split(//, $ARGV[0])"αβγδεζ
    e1 e2 e3 e4 e5 e6

    关于perl - 如何在 ActiveState Perl 中获得正确的非 ASCII 命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7824335/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com