powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - непонятная локаль
7 сообщений из 7, страница 1 из 1
Perl - непонятная локаль
    #38686867
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть perl-скрипт, который запускается на двух идентичных серверах (одинаковая ОС и версия Perl).
Вот фрагмент кода:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
my $sid = shift;
my @res = $soap->getResult($sid);
if (@res)
{
	if ($res[0] eq 'true')
	{
		my $data = decode_base64($res[1]);
		print "$var{'clock'}: OK, ZIP-file length " . length($data) . "\n";
		$dbh->do("update REQUESTS set STAGE=?, STAGE_COUNT=STAGE_COUNT+1, STAGE_TIME=?, RES_RESULT=?, RES_DATA=? where ID = $id{'request'}", undef, ('DONE',time-$var{'timer'},$res[0],$data));
	}
	elsif (($res[0] eq 'false') && ($res[1] eq 'запрос обрабатывается'))
	{
		print "$var{'clock'}: Not OK: $res[1]\n";
		$dbh->do("update REQUESTS set STAGE=?, STAGE_COUNT=STAGE_COUNT+1, STAGE_TIME=?, RES_RESULT=?, RES_COMMENT=? where ID = $id{'request'}", undef, ('RECEIVE',time-$var{'timer'},$res[0],$res[1]));
	}
	else
	{
		print "$var{'clock'}: Service fail, stop\n";
		print Dumper(\@res);
		$dbh->do("update REQUESTS set STAGE=?, STAGE_COUNT=STAGE_COUNT+1, STAGE_TIME=?, RES_RESULT=?, RES_COMMENT=? where ID = $id{'request'}", undef, ('FAIL',time-$var{'timer'},'false',"Response: ".Dumper(\@res)));
	}
}
else
{
	print "$var{'clock'}: Service not response, retry\n";
	$dbh->do("update REQUESTS set STAGE_COUNT=STAGE_COUNT+1, STAGE_TIME=?, RES_RESULT=?, RES_COMMENT=? where ID = $id{'request'}", undef, (time-$var{'timer'},'false','Service not response'));
}



Когда запускаю этот код на одном сервере, получаю такое сообщение:
Код: plaintext
1.
2.
3.
4.
5.
2014-07-03T14:41:44: Service fail, stop
$VAR1 = [
          'false',
          '?·?°??N??N ???±N?°?±?°NN???°?µNNN'
        ];

Нечитаемый текст — это 'запрос обрабатывается'. Но почему-то он в неправильной кодировке. Хотя в начале скрипта указано use utf8 и binmode(STDOUT,':utf8'). И системная локаль UTF-8.
При этом в базу данных (следующая строка) текст пишется в читаемом виде.

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl - непонятная локаль
    #38687038
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сделать так:
Код: php
1.
2.
3.
4.
my @res = $soap->getResult($sid);
open TMP, '>', "tmp";
print TMP Dumper(\@res);
close TMP;


то в файле tmp текст читаемый.
То есть данные уже в UTF-8, но Perl почему-то делает лишнее преобразование.
Не подскажите, где ошибка?
Вот начало скрипта:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#!/usr/bin/perl -w

use strict;
use warnings;
use vars qw ($dbh $soap %modes $options %id %var);
use utf8;
use Encode;
use XML::LibXML;
use DBI;
use SOAP::Lite;
use MIME::Base64;
use Data::Dumper;
$Data::Dumper::Useqq = 1;
{
  no warnings 'redefine';
  sub Data::Dumper::qquote
  {
    my $s = shift;
    return "'$s'";
  }
}

$| = 1;
binmode(STDIN, ':utf8');
binmode(STDOUT,':utf8');
binmode(STDERR,':utf8');
...
Рейтинг: 0 / 0
Perl - непонятная локаль
    #38687061
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока сделал так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
sub _str($)
{
        my $str = shift;
        return utf8::is_utf8($str) ? $str : decode_utf8($str);
}
...
        my @res = $soap->getResult($sid);
        $res[$_] = &_str($res[$_]) foreach (0..$#res);
...


Вроде бы работает.
Но хотелось бы понять, что это за глюк такой, и сделать по человечески.
...
Рейтинг: 0 / 0
Perl - непонятная локаль
    #38687397
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на STDOUT без подключения Data::Dumper выводится нормально?
...
Рейтинг: 0 / 0
Perl - непонятная локаль
    #38687529
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, выводится так же нечитаемо.
То есть пишу print 'запрос обрабатывается' - выводится кириллица.
Пишу print $res[1] - выводится нечитаемый текст.

Создается впечатление, что SOAP::Lite данные получает в utf-8, но флаг utf не устанавливает и Perl лишний раз выполняет преобразование.
А на другом сервере, с такой же конфигурацией, ОС и версиями, все нормально.
...
Рейтинг: 0 / 0
Perl - непонятная локаль
    #38687533
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если закомментировать use utf8 и binmode(STDOUT,':utf8'), то при print $res[1] выводит кириллицу. Но тогда вся кириллица в скрипте становится нечитаемой, поскольку сам скрипт у меня в utf8 (то есть при выполнении print 'запрос обрабатывается' выводится нечитаемый текст).
...
Рейтинг: 0 / 0
Perl - непонятная локаль
    #38687584
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Кстати, если закомментировать use utf8 и binmode(STDOUT,':utf8'), то при print $res[1] выводит кириллицу. Но тогда вся кириллица в скрипте становится нечитаемой, поскольку сам скрипт у меня в utf8 (то есть при выполнении print 'запрос обрабатывается' выводится нечитаемый текст).

а должно быть в этом случае просто предупреждение про wide character in print и нормально читаемый вывод.

сверь с той системой, где всё хорошо и если там так, как я написал выше, значит дело в системных линуксовых настройках.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - непонятная локаль
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]