LINUX.ORG.RU

Проблема с utf-8 при выводе ошибок

 


0

2

Берём для примера скрипт:

#!/usr/bin/env perl
#
use strict;
use warnings;
use utf8;
use v5.12;
use open qw(:encoding(UTF-8) :std);

print "Вот так выводит обычное сообщение\n";
print "Так читает из файла:\n";
open(DATAFILE, "< testfile.txt");
while (<DATAFILE>) {
        print "$_";
}
open (FILE2, "< file_that_no_exist") or die "Не могу открыть файл: $!\n";
close(FILE2);
В testfile, для примера положим пару utf-ных строк:
$ cat testfile.txt
Текст всяческий
ещё текст
Выполняем:
$ perl unicode.pl 
Вот так выводит обычное сообщение
Так читает из файла:
Текст всяческий
ещё текст
Не могу открыть файл: ÐÐµÑ Ñакого Ñайла или каÑалога
Как видно, из переменных читает нормально, из файла тоже. Всякие там сравнения и прочее я проверял, тоже нормально работают, а вот сообщения о критических ошибках пишет кракозябрами. Это в чём проблема? В локали или я ещё что-то упустил?

У меня выводит:

> perl test.pl 
Вот так выводит обычное сообщение
Так читает из файла:
Тест
Не могу открыть файл: No such file or directory
Локаль стоит английская, так что такой проблемы нет. Попробуй прописать:
binmode(STDIN,  ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");

kovrik ★★★★★ ()
Ответ на: комментарий от kovrik

Хотя, нет. Ошибся. Не работает.

Я просто забыл дополнить. Я ещё опыты проводил и попробовал такой вот вариант:

#!/usr/bin/env perl
#
use strict;
use warnings;
use utf8;
use v5.12;
use open qw(:encoding(UTF-8) :std);

print "Вот так выводит обычное сообщение\n";
print "Так читает из файла:\n";
open(DATAFILE, "< testfile.txt");
while (<DATAFILE>) {
        print "$_";
}
no utf8;
open (FILE2, "< file_that_no_exist") or die "Не могу открыть файл: $!\n";
use utf8;
close(FILE2);
Вот так работает. И когда вставлял binmode(), забыл убрать строку с отключением utf.

shell-script ★★★★★ ()
Ответ на: комментарий от kovrik

echo $LANG что выдает?

ru_RU.UTF-8

Я проверил ещё этот же скрипт на другой машине с другой системой - тот же косяк. Т.е. проявляется на gentoo и на debian. Не думаю, что ошибка связана с системной локалью. Больше похоже всё-таки на perl.

shell-script ★★★★★ ()
Ответ на: комментарий от shell-script
~/qsand/perl/rusTestLol $ ./test.pl
Вот так выводит обычное сообщение
Так читает из файла:
ывролар
Не могу открыть файл: Нет такого файла или каталога
~/qsand/perl/rusTestLol $ perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi

Хм, УМВР, единственное, что убрал

use v5.12;

По причине отсутсвия такового.

anonymous ()
Ответ на: комментарий от shell-script

$! - специальная переменная, берет значения системных ошибок (из errno.h).
Так что, видимо, сам перл уже получает ошибку не в utf8.

kovrik ★★★★★ ()
Ответ на: комментарий от kovrik

Я так понимаю, что перл как раз в utf'е получает, но у него же своё внутреннее представление utf'а. Раньше, помнится надо было использовать utf8::decode для таких случаев, но вот как применить это к $! непонятно.

shell-script ★★★★★ ()
Ответ на: комментарий от shell-script

Можно сделать какой-нибудь такой workaround

sub _($) {
  my $err = shift;
  utf8::decode($err);
  $err;
}

open my $fh, '/dev/xxx' or die _$!;

Olegymous ★★ ()
Ответ на: комментарий от Olegymous

Ясно. Понял. Спасибо, буду ждать решения и пока делать обёртку.

shell-script ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.