【问题标题】:Data Type of Module Output模块输出的数据类型
【发布时间】:2012-09-03 13:46:47
【问题描述】:

我有一个脚本,我在各种文本上运行以将 XHTML(例如,ü)转换为 ASCII。比如我的脚本是这样写的:

open (INPUT, '+<file') || die "File doesn't exist! $!";
open (OUTPUT, '>file') || die "Can't find file! $!";

while (<INPUT>) {
     s/&uuml/ü/g;
}

print OUTPUT $_;

这按预期工作,并将 XHTML 替换为 ASCII 等效项。但是,由于这经常运行,我尝试将其转换为模块。但是,Perl 不返回“ü”,而是返回分解。
我怎样才能让 Perl 用 ASCII 等价物返回数据(在我的常规 .pl 文件中运行和打印)?

【问题讨论】:

  • 你是如何保存文件的?你用的是什么 ecnoding?
  • @choroba 输入是 Western Mac OS Roman。我将输出文件保存为 Western Mac OS Roman。

标签: html perl module ascii


【解决方案1】:

没有 ASCII。无论如何,在实践中没有,当然也没有在美国以外的地方。我建议您指定一个包含您可能遇到的所有字符的编码(ASCII 不包含ü,它只是一个 7 位编码!)。 Latin-1 是可能的,但仍然不是最理想的,因此您应该使用 Unicode,最好使用 UTF-8

如果您不想以 Unicode 输出,至少您的 Perl 脚本应该使用 UTF-8 编码。要将此信号发送给 perl 解释器,请在脚本顶部使用 use utf8

然后用这样的编码层打开输入文件:

open my $fh, "<:encoding(UTF-8)", $filename

输出文件也是如此。只需确保在要使用编码时指定编码即可。

您可以使用binmode 更改文件的编码,只需查看documentation

您还可以使用 Encode module 将字节字符串转换为 unicode,反之亦然。有关在 Perl 中使用 Unicode 的更多信息,请参阅excellent question

如果您愿意,可以使用现有的HTML::Entities 模块来处理实体解码,只需专注于 I/O。

【讨论】:

  • 感谢有关 Unicode 的提示。我熟悉 Perl 中的这些做法,以及 HTML::Entities。但是你的cmets没有回答这个问题。我指的是高 ASCII 0x9F 编码,ASCII 是否存在于美国以外的问题是多余的。是的,我完全了解 Unicode 的附加好处。我的问题是脚本文件(.pl)如何正确替换这些,但是如果我将相同的脚本写入使用 .pm 实现的子程序(使用 ISA qw(Exporter),它不会返回 0x9F,但是分解。谢谢
  • @user1628415 字符 0x9F 在大多数编码中不存在,我不知道“高 ASCII”编码。给定的代码映射到 Windows-1252 中的 Ÿ,但我找不到任何其他参考。您使用的是什么特定编码? ASCII 只定义到0x7F
  • 编码是 MacRoman,是的,0x7F 是 0-127 的最后一个编码,但 0x9F 分别在 128-255 范围内。感谢您的帮助。
  • @user1628415 您可以将 MacRoman 编码与Encoding::Byte 模块一起使用。虽然使用 Unicode 仍然是可取的 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多