【问题标题】:How do I make Devel::REPL output human-readable Unicode?如何使 Devel::REPL 输出人类可读的 Unicode?
【发布时间】:2013-12-10 15:20:19
【问题描述】:

我使用Devel::REPL。在转储结构时,它目前使用一些转义符,例如 \x{17d} 来处理字符串中的重音字符。我怎样才能让它直接输出 UTF-8 呢?这是一个例子:

$ re.pl
$ {'žůžo' => ['bříško']}
$HASH1 = { "\305\276\305\257\305\276o" => [ "b\305\231\303\255\305\241ko" ] };

有趣的是直接输入字符串直接输出:

$ re.pl
$ 'žůžo'
žůžo

这应该是“基本”版本:

$ perl -MDevel::REPL -e 'my $repl = Devel::REPL->new; $repl->load_plugin("DDS"); $repl->run'
$ {'žůžo' => ['bříško']}
$HASH1 = { "\305\276\305\257\305\276o" => [ "b\305\231\303\255\305\241ko" ] };

所以看起来Data::Dump::Streamer 是罪魁祸首,但我没有更进一步。我在Perl Monks 上的Data::Dumper 中找到了一些关于Unicode 的讨论,但这显然在这里没有帮助。粗略浏览 Data::Dump::Streamer 文档并没有发现任何有趣的 Unicode 或猴子补丁。

【问题讨论】:

    标签: perl unicode read-eval-print-loop


    【解决方案1】:

    你不能,至少在 Devel::REPL 调用 Data::Dump::Streamer 的情况下是这样。 DDS 将始终对不在 \x20-\x7e 范围内的任何字符进行编码。

    您可以修改 DDS 以提供其他选项。

    【讨论】:

    • 你知道有没有办法快速修改 DDS 以直接打印 Unicode 字符?可能是Data::Dumper 解决方案suggested at Perl Monks 之类的?
    • 同样的事情应该可以工作,只是在 Data::Dump::Streamer::_qquote 而不是 Data::Dumper::qquote 上。
    【解决方案2】:

    看了DDS的源码后,我根据Perl Monks code想出了这个补丁:

    $ cat quote.rc
    {
        no warnings 'redefine';
        sub Data::Dump::Streamer::_qquote {
            my $s = shift;
            return "'$s'";
        }
    }
    $ re.pl --rcfile ./quote.rc
    $ {'žůžo' => ['bříško']}
    $HASH1 = { 'žůžo' => [ 'bříško' ] };
    

    我不知道更改会破坏什么,但由于我的用例非常简单,我对这个 hack 很满意。如果我的房子因此而被烧毁,我会发布更新。

    【讨论】:

    • 除非你以某种方式尝试评估输出并且它有单引号或反斜杠(不会被正确转义),否则什么都不会被破坏
    【解决方案3】:

    转储程序无法知道您的字符串 (C5 BE ...) 是 Unicode 代码点的 UTF-8 编码。具体来说:

    1. 无法知道字符串代表文本。
    2. 即使是这样,它也无法知道文本是否已编码。
    3. 即使是这样,它也无法知道使用的编码是 UTF-8。

    因此,您需要一些非常特定于您的数据结构的东西。您可以根据Devel::REPL::Plugin::DDS 制作自定义插件。

    【讨论】:

      猜你喜欢
      • 2022-11-11
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 2023-03-22
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多