我有一个大小合理的文本文档平面文件数据库,大部分以 8859 格式保存,这些文本文档是通过 Web 表单(使用 Perl 脚本)收集的。直到最近,我还在用一组简单的正则表达式协商常见的 1252 个字符(弯引号、撇号等):
$line=~s/\x91/\&\#8216\;/g; # smart apostrophe left
$line=~s/\x92/\&\#8217\;/g; # smart apostrophe right
... ETC。
然而,由于我决定我应该使用 Unicode,并且已经将我的所有脚本转换为读取和输出 utf8(这对所有新材料都有效),这些(现有)1252 个字符的正则表达式不再有效,我的 Perl html output 从字面上输出 4 个字符:'\x92' 和 '\x93' 等(至少这就是它在 utf8 模式下在浏览器上的显示方式,下载(ftp 不是 http)并在文本编辑器(textpad)中打开它是不同的,一个未定义的字符仍然存在,并且在 Firefox 默认(无内容类型标题)8859 模式下打开输出文件会呈现正确的字符)。
脚本开头的新 utf8 pragma 是:
使用 CGI qw(-utf8); 使用 open IO => ':utf8';
我知道这是由于 utf8 模式使字符成为双字节而不是单字节,并适用于 0x80 到 0xff 范围内的那些字符,阅读了与此相关的维基书籍上的文章,但是我不知道如何过滤它们。理想情况下,我知道我应该以 utf8 模式重新保存所有文档(因为平面文件数据库现在包含 8859 和 utf8 的混合),但是如果我要这样做的话,我首先需要某种过滤器.
对于内部的 2 字节存储,我可能是错误的,因为它似乎暗示 Perl 根据不同的情况处理非常不同的东西。
如果有人可以为我提供正则表达式解决方案,我将不胜感激。或者其他一些方法。数周来,我一直在为此烦恼,尝试了各种尝试,但黑客攻击失败了。通常需要替换大约 6 个 1252 字符,并且通过过滤器方法,我可以在 utf8 中重新保存整个翻转批次,而忘记曾经有一个 1252 ......