gpt4 book ai didi

perl - 使用 Perl 采用 Unicode 方式的 list

转载 作者:行者123 更新时间:2023-12-03 12:35:33 24 4
gpt4 key购买 nike

我正在帮助客户将他们的 Perl 平面文件公告板站点从 ISO-8859-1 转换为 Unicode。

由于这是我第一次,我想知道以下“ list ”是否完整。一切都在测试中运行良好,但我可能会遗漏一些只会在极少数情况下发生的东西。

这是我到目前为止所做的(请原谅我只包含“摘要”代码示例):

  • 确保文件始终以 UTF-8 读写:
    use open ':utf8';
  • 确保以 UTF-8 格式接收 CGI 输入(该站点未使用 CGI.pm):
    s{%([a-fA-F0-9]{2})}{ pack ("C", hex ($1)) }eg;    # Kept from existing code
    s{%u([0-9A-F]{4})}{ pack ('U*', hex ($1)) }eg; # Added
    utf8::decode $_;
  • 确保文本打印为 UTF-8:
    binmode STDOUT, ':utf8';
  • 确保浏览器将我的内容解释为 UTF-8:
    Content-Type: text/html; charset=UTF-8
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
  • 确保表单发送 UTF-8(只要设置了页面编码,可能就不需要):
    accept-charset="UTF-8"
  • 不要认为我需要以下内容,因为内联文本(菜单、标题等)仅使用 ASCII:
    use utf8;

  • 这看起来合理还是我错过了什么?

    编辑:我可能还应该提到,我们将运行一次性批处理来读取所有现有的文本数据文件并将它们保存为 UTF-8 编码。

    最佳答案

  • :utf8 PerlIO 层是 not strict enough 。它允许输入满足 UTF-8 字节序列的结构要求,但为了良好的安全性,您希望拒绝实际上不是有效 Unicode 的内容。用 PerlIO::encoding 层替换它,因此: :encoding(UTF-8)
  • 出于同样的原因,总是 Encode::decode('UTF-8', …) ,而不是 Encode::decode_utf8(…)
  • 使解码异常失败,比较:
    perl -E'use Encode qw(decode); say decode(q(UTF-8), qq(\x{c0})); say q(survived)'
    perl -E'use Encode qw(decode); say decode(q(UTF-8), qq(\x{c0}), Encode::FB_CROAK); say q(survived)'
  • 您没有处理 %u 表示法中的代理对。这是我可以在您的列表中看到的唯一主要错误。 2. 正确写为:
    use Encode qw(decode);
    use URI::Escape::XS qw(decodeURIComponent);
    $_ = decode('UTF-8', decodeURIComponent($_), Encode::FB_CROAK);
  • 不要乱用 utf8 模块的功能。它的文档是这样说的。它的目的是作为一个编译指示告诉 Perl 源代码是 UTF-8 格式的。如果要进行编码/解码,请使用 Encode 模块。
  • 在每个模块中添加 utf8 杂注。它不会受到伤害,但如果有人添加这些字符串文字,您将进行面向 future 的代码维护。另见 CodeLayout::RequireUseUTF8
  • 使用 encoding::warnings 抽出剩余的隐式升级。验证每种情况是否有意/需要。如果是,则使用 Unicode::Semantics 将其转换为显式升级。如果没有,这暗示您应该早先进行解码步骤。来自 http://p3rl.org/UNI 的文档建议在收到源数据后立即解码。查看代码读取/写入数据的位置,并验证您有一个解码/编码步骤,无论是显式(decode('UTF-8', …))还是隐式通过层(use open pragma,binmodeopen 的 3 个参数形式)。
  • 用于调试:如果您不确定在某个时间以何种形式表示的变量中的字符串,您不能只使用 print ,而是使用工具 Devel::StringInfo Devel::Peek
  • 关于perl - 使用 Perl 采用 Unicode 方式的 list ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735721/

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