使用Perl进行Unicode方式的清单
我正在帮助客户将其Perl平面文件公告板站点从ISO-8859-1转换为Unicode。
既然这是我第一次,我想知道下面的“清单”是否完整。一切都在测试中运行良好,但我可能会错过只会在极少数情况下发生的事情。 这是我迄今为止所做的(原谅我只包括“摘要”代码示例): 确保文件始终以UTF-8读取和写入: use open ':utf8'; >确保CGI输入以UTF-8收到(站点不使用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); >不要乱用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |