我使用perl v5.10(在Windows 7上)+ TT v2.22。当我使用TT时,对于每个源代码行,我会在生成的html中添加一个额外的CR
:
源文本(Windows格式):
"Some_html" CR LF
输出文字:
"Some_html" CR
CR LF
但是,当我将源文件转换为unix格式,然后运行TT时,我得到:
源文本(unix格式):
"Some_html" LF
输出文字:
"Some_html" CR LF
(我使用notepad ++来显示CR& LF字符;也可以在源模板中更改unix< - > windows格式)。
当我谷歌问题时,我在Windows上收到一些(少数)关于额外^M
的帖子,但我找不到解释因为根本原因既不是真正的解决方案(只是一些解决方法如何摆脱额外^M
)。
虽然不是真正的问题,但我发现它非常“不干净”
是否有一些我应该打开的配置(我查看过www.template-toolkit.org/docs/manual/Config.html但找不到任何内容)?
其他解决方案? (除了修复输出文件之外)。
感谢
答案 0 :(得分:11)
Template Toolkit以二进制模式读取模板的源文件,但以文本模式写入。来自模板的数据(包含CR LF)在文本模式的输出期间被转换,因此LF变为CR LF。
解决此问题的最简单方法是以二进制模式写入文件(请注意raw
修饰符到open
调用):
my $tt = Template->new;
my $output_file = 'some_file.txt';
open my $out_fh, '>:raw', $output_file or die "$output_file: $!\n";
$tt->process('template', \%data, $out_fh) or die $tt->error();
答案 1 :(得分:0)
[% FILTER redirect(...) %]
生成的输出。在Windows 10上,模板
[% FILTER redirect("bar.txt") %]
This text is for bar.txt.
[% END %]
This text is for foo.txt.
(带有DOS式CR-LF线路结尾)通过
扩展#! /bin/perl
use strict;
use warnings;
use Template;
my $tt = Template->new({
OUTPUT_PATH => '.',
RELATIVE => 1,
}) || die "$Template::ERROR\n";
my $srcfile = 'foo.txt.tt';
my $tgtfile = 'foo.txt';
open my $ofh, '>:raw', $tgtfile or die;
$tt->process($srcfile, {}, $ofh, { binmode => ':raw' })
|| die $tt->error . "\n";
使用预期的CR-LF行结尾创建输出文件foo.txt,但创建带有错误CR-CR-LF行结尾的bar.txt:
> od -c bar.txt
0000000 \r \r \n T h i s t e x t i s
0000020 f o r b a r . t x t . \r \r \n
0000037
我在https://github.com/abw/Template2/issues/63向TT作者报告了此问题。
我找到了一个简单的解决方案:在子Template :: _输出(在Template.pm中),更改
my $bm = $options->{ binmode };
到
my $bm = $options->{ binmode } // $BINMODE;
然后在你的主perl脚本集
$Template::BINMODE = ':raw';
然后您可以使用
处理模板$tt->process($srcfile, {}, $tgtfile) || die $tt->error . "\n";
并在主输出和重定向输出中获得CR-LF行结尾。
答案 2 :(得分:0)
祝你有个美好的一天, 我找到了一个非常简单的解决方案:
CREATE TABLE `tbl_order` (
`order_id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`cus_fullname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`total_price` double DEFAULT NULL,
`active` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `tbl_payment` (
`pay_id` int(50) NOT NULL,
`pro_id` int(15) NOT NULL,
`pay_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`pay_email` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`pay_adress` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`pay_cardname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`pay_cvc` int(3) NOT NULL,
`pay_number` text COLLATE utf32_unicode_ci NOT NULL,
`pay_mm` int(2) NOT NULL,
`pay_yyyy` int(4) NOT NULL,
`pay_totals` varchar(255) COLLATE utf32_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf32 COLLATE=utf32_unicode_ci;
此配置将指示模板引擎删除模板文本的所有前后CR LF。