Как я могу открыть файл Unicode с Perl?

Я использую osql для запущения нескольких sql скриптов против базы данных, и затем я должен посмотреть на файл результатов, чтобы проверить, произошли ли какие-либо ошибки. Проблема состоит в том, что Perl, кажется, не нравится то, что файлы результатов являются Unicode.

Я записал немного сценария тестирования для тестирования его, и вывод выходит, все пели:

$file = shift;

open OUTPUT, $file or die "Can't open $file: $!\n";
while (<OUTPUT>) {
    print $_;
    if (/Invalid|invalid|Cannot|cannot/) {
        push(@invalids, $file);
        print "invalid file - $inputfile - schedule for retry\n";
        last;
    }            
}

Какие-либо идеи? Я попытался декодировать использование decode_utf8 но это не имеет никакого значения. Я также попытался установить кодирование при открытии файла.

Я думаю, что проблема могла бы состоять в том, что osql помещает файл результата в формат UTF-16, но я не уверен. Когда я открываю файл в textpad, он просто говорит мне 'Unicode'.

Править: Используя Редактирование perl v5.8.8: Шестнадцатеричный дамп:

file name: Admin_CI.User.sql.results
mime type: 

0000-0010:  ff fe 31 00-3e 00 20 00-32 00 3e 00-20 00 4d 00  ..1.>... 2.>...M.
0000-0020:  73 00 67 00-20 00 31 00-35 00 30 00-30 00 37 00  s.g...1. 5.0.0.7.
0000-0030:  2c 00 20 00-4c 00 65 00-76 00 65 00-6c 00 20 00  ,...L.e. v.e.l...
0000-0032:  31 00                                            1.
10
задан brian d foy 19 February 2016 в 08:29
поделиться

3 ответа

Файл предположительно в формате UCS2-LE (или UTF-16).

C:\Temp> notepad test.txt

C:\Temp> xxd test.txt
0000000: fffe 5400 6800 6900 7300 2000 6900 7300  ..T.h.i.s. .i.s.
0000010: 2000 6100 2000 6600 6900 6c00 6500 2e00   .a. .f.i.l.e...

При открытии такого файла для чтения необходимо указать кодировку:

#!/usr/bin/perl

use strict; use warnings;

my ($infile) = @ARGV;

open my $in, '<:encoding(UCS-2le)', $infile
    or die "Cannot open '$infile': $!";

Обратите внимание, что fffe в начале - это BOM.

16
ответ дан 3 December 2019 в 15:06
поделиться

Ответ приведен в документации для open, которая также указывает вам на perluniintro. :)

open my $fh, '<:encoding(UTF-16LE)', $file or die ...;

Вы можете получить список имен кодировок, поддерживаемых вашим perl:

% perl -MEncode -le "print for Encode->encodings(':all')"

После этого,Вам нужно узнать, какова кодировка файла. Точно так же вы открываете любой файл с кодировкой, отличной от кодировки по умолчанию, независимо от того, определен ли она Юникодом или нет.

У нас есть глава в Эффективное программирование На Perl, в которую подробно рассматриваются детали.

9
ответ дан 3 December 2019 в 15:06
поделиться

Попробуйте открыть файл с указанным уровнем ввода-вывода, например :

open OUTPUT,  "<:encoding(UTF-8)", $file or die "Can't open $file: $!\n";

Подробнее об этом см. perldoc open .

5
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: