代码之家  ›  专栏  ›  技术社区  ›  Nikolai Prokoschenko

将旧的Perl代码移到UTF-8时,我应该预料到什么问题?

  •  7
  • Nikolai Prokoschenko  · 技术社区  · 16 年前

    到目前为止,我工作的项目只在源代码中使用了ASCII。由于i18n区域中的一些即将发生的变化,以及我们在测试中需要一些Unicode字符串,我们正在考虑咬住子弹并将源代码移动到utf-8,同时使用 utf8 语用学 use utf8; )

    因为代码现在是ASCII格式的,所以我不希望代码本身有任何问题。但是,我不太清楚我们可能会遇到的任何副作用,但考虑到我们的环境(Perl5.8.8、Apache2、Mod_Perl、带Freetds驱动程序的MSSQL服务器),我认为很可能会遇到一些副作用。

    如果你以前做过这样的迁移:我能预料到什么问题?我如何管理它们?

    2 回复  |  直到 16 年前
        1
  •  4
  •   John O'Rourke    16 年前

    几年前,我把我们内部的mod euperl平台(~35k loc)移到了utf-8。以下是我们必须考虑/改变的事情:

    • 尽管Perl-Doc建议“仅在必要时使用”,但是在每个源文件中使用“use utf8;”,这会提供一致性。
    • 将数据库转换为utf-8,并确保db config将连接字符集设置为utf-8(在MySQL中,执行此操作时注意varchars的字段长度问题)
    • 使用DBI的最新版本-旧版本没有正确设置返回的scalar上的utf8标志
    • 使用encode模块,避免使用Perl内置的utf8函数,除非您确切知道要处理的是什么数据。
    • 读取UTF-8文件时,请指定层- open($fh,"<:utf8",$filename)
    • 在Redhat风格的操作系统(甚至2008年的版本)中,所包含的库不喜欢读取以utf8 scalars存储的XML文件-升级perl或只使用 :raw
    • 在较旧的Perls(甚至是5.8.x版本)中,一些较旧的字符串函数可能是不可预测的-例如。 $b=substr(lc($utf8string),0,2048) 随机失败,但 $a=lc($utf8string);$b=substr($a,0,2048) 作品!
    • 请记住转换输入-例如,在Web应用程序中,传入的表单数据可能需要解码
    • 确保所有开发人员都知道编码/解码这两个术语的含义——Perl中的“utf8字符串”是/de/编码形式的,包含utf8数据的原始字节字符串是/en/编码形式的
    • 正确处理URL-/en/-将utf8字符串编码为字节,然后进行%xx编码以生成URL的ASCII格式,并在从mod_perl(例如 $uri=utf_decode($r->uri()) )
    • 对于Web应用程序,请记住HTTP头中的字符集将覆盖指定的字符集 <meta>
    • 我敢肯定这句话是不言而喻的——如果你做任何字节操作(如包数据、位操作,甚至是一个mime内容长度头),确保你是用字节而不是字符计算的。
    • 确保开发人员知道如何确保他们的文本编辑器设置为utf-8,即使给定文件上没有bom
    • 请记住,确保您的版本控制系统(为了谷歌的利益-Subversion/SVN)能够正确处理这些文件。
    • 在可能的情况下,对于文件名和变量名,请使用ASCII,这样可以避免在移动代码或使用不同的开发工具时出现可移植性问题。

    再来一个-这是黄金法则- 不要只在它工作之前进行黑客攻击,确保您完全理解在给定的en/解码情况下发生的事情!

    我敢肯定你已经把这些问题解决了,但希望所有这些都能帮助那些人避免我们经历的长时间调试。

        2
  •  11
  •   Community Mohan Dere    9 年前

    这个 utf8 pragma只告诉perl您的源代码是utf-8编码的。如果您只在源代码中使用了ASCII,那么Perl理解源代码不会有任何问题。为了安全起见,您可能希望在源代码管理中创建一个分支。:)

    如果您需要处理来自文件的utf-8数据,或者将utf-8写入文件,则需要在文件句柄上设置编码,并按照外部位的期望对数据进行编码。例如,请参见, With a utf8-encoded Perl script, can it open a filename encoded as GB2312? .

    查看有关Unicode的Perl文档:

    也看到 Juerd's Perl Unicode Advice .

    推荐文章