代码之家  ›  专栏  ›  技术社区  ›  W3Coder

使用Perl的Unicode检查表

  •  19
  • W3Coder  · 技术社区  · 16 年前

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

    因为这是我第一次,我想知道下面的“清单”是否完整。在测试中一切都很好,但我可能遗漏了一些只有在极少数情况下才会发生的事情。

    这就是我迄今为止所做的(请原谅我只包含了“摘要”代码示例):

    1. 确保文件始终以UTF-8进行读写:

      use open ':utf8';
      
    2. 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 $_;
      
    3. binmode STDOUT, ':utf8';
      
    4. 确保浏览器将我的内容解释为UTF-8:

      Content-Type: text/html; charset=UTF-8
      <meta http-equiv="content-type" content="text/html;charset=UTF-8">
      
    5. 确保表单发送UTF-8(只要设置了页面编码,就可能不需要):

      accept-charset="UTF-8"
      
    6. use utf8;
      

    这看起来合理还是我遗漏了什么?

    2 回复  |  直到 16 年前
        1
  •  27
  •   daxim Fayland Lam    16 年前
    • 这个 :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 Encode 模块。

    • 添加 utf8型 每个模块都有pragma。这不会有什么坏处,但您将在将来验证代码维护,以防有人添加这些字符串文字。另请参见 CodeLayout::RequireUseUTF8 .

    • 雇用 encoding::warnings Unicode::Semantics . 如果没有,这是一个提示,您应该在前面有一个解码步骤。文件来自 http://p3rl.org/UNI 给出在收到源数据后立即解码的建议。检查代码读取/写入数据的位置,并验证是否有解码/编码步骤,或者是显式的( decode('UTF-8', …) )或者隐式地穿过一层( use open binmode ,3参数形式 open

    • 对于调试:如果您不确定某个变量在某个特定时间的哪个表示中包含哪个字符串,则不能 print ,使用工具 Devel::StringInfo Devel::Peek 相反。

        2
  •  8
  •   brian d foy    10 年前

    你总是漏掉一些东西。但问题通常是未知的。:)

    Effective Perl Programming 有一章介绍了许多Perl基础知识。但是,有一点我们没有涉及,那就是你必须做的一切来确保你的数据库服务器和web服务器做正确的事情。

    您还需要做一些其他事情:

    • 升级到最新的Perl版本。Unicode的东西在5.8中变得容易多了,在5.10中甚至更容易。

    • 确保网站内容已转换为UTF-8。您可以编写一个爬虫来访问页面并查找Unicode替换字符(看起来像带问号的菱形)。让我们看看我是否能在StackOverflow中成功:

    如果您还发现了什么,请用我们遗漏的内容回答您的问题。;)