gpt4 book ai didi

perl - 怎么打开:utf8 pragma works in perl - in relation to CPAN modules?

转载 作者:行者123 更新时间:2023-12-04 02:21:16 24 4
gpt4 key购买 nike

我已经阅读了下一篇:

  • Perl Unicode Cookbook
  • How differs the open pragma with different utf8?
  • How to use utf8 encode with open pragma
  • Does the autodie-pragma have influence on the encoding?
  • 许多其他...(例如:perlunicode perluniintro、perlunifaq、perlunitut)... ;(
  • ,当然还有tchrist的天才答案Why does modern Perl avoid UTF-8 by default?

  • 但可能错过了一些基本点。

    使用
    use open(:utf8);

    也影响 cpan 模块?例如。当某些 CPAN 模块打开任何文件时,它会用 :utf8 打开吗?这个说法是真的吗? (或者 open pragma 只是词法范围?)AFAIK - 它也影响模块,但是以“不一致”的方式..(可能是模块的问题)。
    open pragmaopendir 有影响吗? - 我已经尝试过 - 没有 - 我仍然需要来自 decode 的所有文件名的额外 readdir(除了 NFC)。所以,IO::Dir 是不同的——开放式编译指示没有涵盖哪些内容?

    影响打开的 pragma sockets ,管道也? (例如,什么是 IO::Handle ?)

    所有(或大多数)CPAN 模块在执行 i/o 时都知道他们需要如何执行(utf8 或 lattin1 或 raw?)(可能不是,因为简单的 autodie 不适用于 open pragma ... :()

    在很多地方我都能读到类似的规则:记住 Unicode 的规范规则:始终在应用程序的边缘进行编码/解码。这是一个很好的规则——但应用程序的优势意味着:我自己的源代码。 CPAN 模块(通常)也位于边缘之后 - 不仅是“外部世界”,如系统或网络......

    根据我的经验,我的短脚本(大量使用 CPAN)的 3/4 内容包含:顶级声明,以及几乎所有内容的数十个编码/解码/NFC……

    例如。:
    即使是日志记录实用程序,也需要显式编码:
    use Log::Any qw($log);
    use Log::Any::Adapter ('File', 'file.log');
    $log->error( encode('utf-8', "tökös"));

    甚至,当想要将 tie 添加到我的代码中时,需要将每个 $key $value 替换为编码版本。

    这是真的,还是我错过了以上所有内容中的一些非常基本的点?

    一些处理 utf8(内部)的 CPAN 模块,例如 JSON::XS、YAML::XS、File::Slurp..(尽管从未成功从 YAML::XS 获得正确的“东西”,但纯 YAML 和 JSON::XS 无需任何问题...

    对于某些模块存在“黑客”——比如 DBIx::Class::ForceUTF8Template::Stash::ForceUTF8HTML::FillInForm::ForceUTF8 ——等等, - 什么不允许为“两者” utf 和非 utf 世界编写正确的应用程序...... ;(

    许多 CPAN 模块不会在内部调用上述“被破解的变体”-(例如 HTML::FillInForm::ForceUTF8 ),而只是简单的,因此无法将它们与 utf8 正确使用……其他人,默默地失败……;(

    如果没有烦人的“宽字符....”,Plack 应用程序无法处理 utf8 日志消息;(/modern perl :(/并且可以继续;(

    从上面我“扣除”(可能是错误的) - 比我 必须 知道并记住每个 CPAN 模块它是如何处理 utf8 编码字符串的,因为没有任何地方是一些“注册表” - 主要是基于试验/错误。

    所以主要问题是:

    虽然我记得:这不是 Elixir , 但这里有一些好方法如何检测和了解“utf8 就绪 CPAN 模块”在使用它们之前不需要特殊编码/解码吗?

    如果有人需要知道,我将在每个脚本中使用下一个:
    use 5.014;
    use warnings;
    use utf8;
    use feature qw(unicode_strings);
    use charnames qw(:full);
    use open(:utf8); #this sometimes is bad, so using only open qw(:std :utf8);
    use Encode qw(encode decode);
    use Unicode::Normalize qw(NFD NFC);

    嗯..刚刚“发现”了 utf8:all perl模块,它用解码的版本替换了 readdir

    最佳答案

    强调我的:

    The open pragma serves as one of the interfaces to declare default "layers" (also known as "disciplines") for all I/O. Any two-argument open, readpipe (aka qx//) and similar operators found within the lexical scope of this pragma will use the declared defaults. Even three-argument opens may be affected by this pragma when they don't specify IO layers in MODE.



    所以不,它不会影响任何不存在编译指示的代码。但是,如果将在这种 pragma 范围内打开的句柄传递给 pragma 范围之外的代码,则不会丢失其层。

    测试以查看模块的期望:

    输入
  • 测试 1
  • 让输入源返回一个字符串,其中包含 80..FF 中的代码点,并且在 FF 之上没有代码点。
  • 测试 2
  • 让输入源返回一个包含 FF 以上代码点的字符串。

  • 输出
  • 测试 1
  • 输出一个字符串,其中包含 80..FF 中的代码点,并且在 FF 之上没有代码点。通过 utf8::downgrade($_); 传递字符串第一的。
  • 测试 2
  • 与测试 1 相同,但通过 utf8::uprade($_); 传递字符串第一的。
  • 测试 3
  • 输出包含 FF
  • 以上代码点的字符串

    关于perl - 怎么打开:utf8 pragma works in perl - in relation to CPAN modules?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408405/

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