【问题标题】:HTML::Tidy on Windows newline issue关于 Windows 换行问题的 HTML::Tidy
【发布时间】:2011-06-27 01:18:36
【问题描述】:

在 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 代码时,问题才会显现出来。

【问题讨论】:

    标签: html windows perl newline htmltidy


    【解决方案1】:

    试图使输出文件二进制:

    binmode($output);
    

    我在模板工具包的输出中遇到了类似的问题。

    【讨论】:

    • 它实际上是在输出 unicode,但这有点帮助。设置它 ':raw' 确实会输出正确的 EOL 字符。将其保留为默认 binmode 会产生与 unicode binmode 相同的问题。但是,对于 raw 和 default 那么 print 当然会抱怨将宽 unicode 字符打印到文件句柄。
    • 这种情况你可以试试binmode($output, ":raw:utf8");
    • 没有意识到 binmodes 可以合并。我看到 PerlIO 有这些方面的文档;我需要阅读它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多