4

在 Windows 上使用 HTML::Tidy 清理 HTML::Element as_HTML 方法的输出时,我得到了错误类型的换行符。如果我没有在 HTML::Tidy 构造函数中指定换行符,我的行会被 CRCRLF 终止。如果我指定“LF”终止,我会得到“CRLF”,如果我指定“CRLF”,我会得到原始的 CRCRLF 终止。我怀疑这是 HTMLtidy 库中的一个错误,通过明确指定 Unix 终止并退出 DOS 很容易解决,几乎任何体面的编辑器都可以在任何平台上解析。

根据答案,我在适当的句柄上使用 binmode ':raw:utf8' 解决了这个问题,以禁用/n插值:

my $output = IO::File->new($ARGV[1], 'w');
$output->binmode(':raw:utf8');
print $output HTML::Tidy->new( { wrap => 80,
                                 indent => 'auto',
                                 'wrap-attributes' => 'yes',
                               }
                             )->clean($tree->as_HTML());

它非常通用,但除了 HTMLtidy 库的一般错误之外,我找不到其他人有问题的真正提及。有没有人处理过这个问题并且可以确认这是一个库错误?如果是这样,我会感到惊讶,因为图书馆已经存在了很长时间,并且想在提交报告之前进行确认。

编辑:我更新了代码以显示文件句柄的创建。该问题可以通过将文件句柄 binmode 设置为 raw 来解决,但是由于HTML 内容中的Unicode ,我遇到了问题。有没有办法在不插入其他问题的情况下解决它?

编辑 2:我应该注意,我最初将此视为 HTML::Tidy 问题,因为使用任何 binmode 将直接 $tree->as_HTML() 打印到文件句柄都会导致正确的 EOL 字符。只有当我将标量 HTML::Element 输出包装为带有 HTML::Tidy 的 HTML 代码时,问题才会显现出来。

4

1 回答 1

2

试图使输出文件二进制:

binmode($output);

我对模板工具包输出有类似的问题。

于 2011-02-14T17:50:51.807 回答