如何在Windows上从ActivePerl输出具有unix行结尾的UTF-8编码XML文件?

如何在Windows上从ActivePerl输出具有unix行结尾的UTF-8编码XML文件?,perl,unix,file,winapi,utf-8,Perl,Unix,File,Winapi,Utf 8,我正在WinXP上运行ActivePerl 5.8.8。我想将XML文件输出为UTF-8,带有UNIX行结尾 我已经查看了perldoc,但是不确定确切的语法(如果我没有查错的话)。下面的内容不能做到这一点(请原谅我的Perl——这是一个学习过程!) 我想你需要这样的东西 use strict; use warnings; sub save_file { my ($file_name, $content) = @_; open my $fh, ">", $file_nam

我正在WinXP上运行ActivePerl 5.8.8。我想将XML文件输出为UTF-8,带有UNIX行结尾

我已经查看了perldoc,但是不确定确切的语法(如果我没有查错的话)。下面的内容不能做到这一点(请原谅我的Perl——这是一个学习过程!)


我想你需要这样的东西

use strict;
use warnings;

sub save_file {
    my ($file_name, $content) = @_;
    open my $fh, ">", $file_name or die $!;
    binmode $fh, ':utf8 :unix';
    print $fh @$content;
    close $fh;
}

# For example.
save_file('foo.txt', [ map "$_\n", qw(foo bar baz)]);

对于
open
的三参数形式的典型用法,您希望在调用
open
之前未定义文件句柄变量。有关详细信息,请参阅。

如果$Contents没有
\n
字符,
打印将不会为您添加这些字符。你必须自己做

还有一些事情可能会有问题;下面是如何修复它们以及原因

要启用utf8输出,您需要使用
:utf8
,而不是
:utf-8
。此外,IO层中不应该有空格,因此它应该看起来像““>:utf8:unix”

打开
文件,您可以在行中声明“my$fh”;无需将其初始化为字符串即可启动。没关系,这是个好习惯。此外,使用
是捕获开放错误的首选方法

更改后,您的代码现在如下所示:

sub SaveFile
{
    my($FileName, $Contents) = @_;

    open my $File, ">:utf8:unix", $FileName
        or die "Cannot open $FileName";
    print $File map { "$_\n" } @$Contents;

    close($File);
}
允许您通过在打印前向每一行添加换行符来转换输入数组,并按顺序执行


祝你好运

在我的XP环境中,这会输出UTF-8,但不会输出UNIX行结束符。@Umber-cherrule不确定问题出在哪里。它适用于XP,包括Unix新行。这里有一个文件转储:
666f 6f0a 6261 720a 6261 7a0a
。我很好奇您为什么关心行尾。XML不在乎。无论你用什么读回文件都不应该在意。你打算用
my$file=“SAVE”实现什么?@AmbroseChapel:我同意,我们不应该在意,但是(图书馆管理系统-Ex Libris'Aleph)软件很挑剔。
sub SaveFile
{
    my($FileName, $Contents) = @_;

    open my $File, ">:utf8:unix", $FileName
        or die "Cannot open $FileName";
    print $File map { "$_\n" } @$Contents;

    close($File);
}