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