powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Запутался в кодировках
2 сообщений из 2, страница 1 из 1
Perl: Запутался в кодировках
    #38402699
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть Perl-скрипт в кодировке UTF-8.
Скрипт запускается в консоли Windows; кодировка самой консоли cp866, аргументы в скрипт передаются в cp1251.
Скрипт подключается к БД Oracle.
Код скрипта:
Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
use strict;
use warnings;
use utf8;
...
binmode(STDIN, ':encoding(cp1251)');
binmode(STDOUT,':encoding(cp866)');
binmode(STDERR,':encoding(cp866)');
use Encode;
$ARGV[$_] = decode('cp1251',$ARGV[$_]) foreach (0..$#ARGV);
no Encode;
...
sub dblink()
{
	$ENV{'NLS_LANG'} = 'RUSSIAN_CIS.UTF8';
	my $dbh = DBI->connect($datalink, $dbuser, $dbpass, {RaiseError => 0, AutoCommit => 0} );
	$dbh->do("ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '. '");
	$dbh->do("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'");
	$dbh->do("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH:MI:SS'");
	return $dbh;
}

sub sqlcmd($;$)
{
	my $sql = shift||'';
	my $params = shift;
	my $q = $dbh->prepare($sql);
	if ($params && ref($params) eq 'HASH')
	{
		$q->bind_param(":$_", $params->{$_}) foreach keys(%{$params});
	}
	my $ret = $q->execute();
	{
		my @rows = ();
		while ( my $row = $q->fetchrow_hashref )
		{
			my $enc = {};
			$enc->{$_} = $row->{$_} foreach keys (%{$row});
			push @rows, $enc;
		}
		return \@rows;
	}
}
...

__DATA__

{sql_sample}
select ...
, 'тест1' as test_column
, 'тест2' as "тест_столбец"
from ...
where field like :find||'%'



В скрипте:

1. Устанавливаются локали на вход и выход (stdin, stdout).
2. Перекодируются входные аргументы.
3. При подключении к БД выставляется кодировка utf8.
4. SQL-запрос отправляется на сервер в UTF.
5. С сервера данные должны тоже приходить в UTF.

Однако данные я получаю примерно в таком виде:
Код: plaintext
1.
2.
3.
4.
$VAR1 = {
          'TEST_COLUMN' => "\x{442}\x{435}\x{441}\x{442}1",
          '\x{00d1}\x{0082}\x{00d0}\x{00b5}\x{00d1}\x{0081}\x{00d1}\x{0082}_\x{00d1}\x{0081}\x{00d1}\x{0082}\x{00d0}\x{00be}\x{00d0}\x{00bb}\x{00d0}\x{00b1}\x{00d0}\x{00b5}\x{00d1}\x{0086}' => "\x{442}\x{435}\x{441}\x{442}2",
        };

Причем из вывода видно, что содержимое полей и наименование полей преобразуется по разному.
Не подскажите, как нужно написать строку $enc->{$_} = $row->{$_} foreach keys (%{$row}) чтобы получить читаемый текст?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl: Запутался в кодировках
    #38402710
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... Оказалось это Data::Dumper мне голову морочил.
Сделал так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
use Data::Dumper;
$Data::Dumper::Useqq = 1;
{
  no warnings 'redefine';
  sub Data::Dumper::qquote
  {
    my $s = shift;
    return "'$s'";
  }
}


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


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