Как я могу вывести XML-файл в кодировке UTF-8 с окончаниями строк Unix из ActivePerl в Windows? - PullRequest
3 голосов
/ 30 апреля 2010

Я использую ActivePerl 5.8.8 на WinXP. Я хотел бы вывести файл XML в формате UTF-8 с окончанием строки UNIX.

Я посмотрел на perldoc для binmode, но не уверен в точном синтаксисе (если я не лаю неправильное дерево). Следующее не делает этого (простите мой Perl - это процесс обучения!):

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

    my $File = "SAVE";
    unless( open($File, ">:utf-8 :unix", $FileName) )
    {
        die("Cannot open $FileName");
    }
    print $File @$Contents;

    close($File);
}

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

Если $ Contents еще не содержит \n символов, print не добавит их для вас. Ты должен сделать это сам.

Есть пара других вещей, которые могут быть проблематичными; вот как их исправить и почему.

IO Layers

Чтобы включить вывод utf8, вам нужно использовать :utf8, а не :utf-8. Кроме того, у вас не должно быть пробелов в слоях ввода-вывода, поэтому он должен выглядеть как `">: utf8: unix ".

Open

Чтобы open файл, вы можете объявить 'my $ fh' в строке; нет необходимости инициализировать его в строку, чтобы начать. Это хорошо, это хорошая практика. Кроме того, использование or является предпочтительным способом обнаружения открытых ошибок.

Изменено, теперь ваш код выглядит так:

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

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

    close($File);
}

map позволяет вам преобразовывать входной массив, добавляя новые строки в каждую строку перед тем, как он их печатает, и делает это по порядку.

Удачи!

1 голос
/ 30 апреля 2010

Я думаю, тебе нужно что-то подобное.

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. Подробнее см. документы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...