Как сохранить результат работы Data::Dumper в файл так, чтобы нормально был
виден русский текст, а не в виде юникодных кодов?
Делаю так:
use Encode;
use encoding "cp1251", STDOUT=>"cp866";
$d->{russian}='Рашн текст';
#open F,">:utf8","sells";
open F,">:encoding(cp1251)","sells";
print F Data::Dumper->Dump([$d],['d']);
close F
в итоге в файле получаю:
'russian' => "\x{420}\x{430}\x{448}\x{43d}
'russian' => \x{442}\x{435}\x{43a}\x{441}\x{442}",
А как получить исходный "Рашн текст" ?
До скорых встреч, *All* С уважением, *Sergey*.
SG> ��� ��������� ��������� ������ Data::Dumper � ���� ���, �����
SG> ��������� ��� ����� ������� �����, � �� � ���� ��������� �����?
SG> ����� ���:
SG> use Encode;
SG> use encoding "cp1251", STDOUT=>"cp866";
(note ��� �����������������, ���� ����� ����, �����) �������� ���������
�� �������. ���� �� �������� ���� ������ ������.
SG> $d->{russian}='���� �����';
SG> #open F,">:utf8","sells";
SG> open F,">:encoding(cp1251)","sells";
SG> print F Data::Dumper->Dump([$d],['d']);
SG> close F
SG> � ����� � ����� �������:
SG> 'russian' => "\x{420}\x{430}\x{448}\x{43d}
SG> 'russian' => \x{442}\x{435}\x{43a}\x{441}\x{442}",
(Subj ������ ��� ����: "���� ���������") � �����, � ��������� ������
���������� ������. �������� ����� Dump � ������, �������� �� ������ �
s{}{}ge, ����� �������� ��� ������ (� 'open F, ">:encoding"') ������
��������. ������, �������� ���� �� *internal encoding*. ��� ��� � �
���������. ��� ���������� ����� ��� ������ �� ��������.
SG> � ��� �������� �������� "���� �����" ?
print "russian => $d->{russian}";
��� �������, �� ������� �� � ��� �����������.
--
Torvalds' goal for Linux is very simple: World Domination
Stallman's goal for GNU is even simpler: Freedom
В субботу, 29 января 2011 года, в 14:45, ты писал(а) мне:
SG>> Как сохранить результат работы Data::Dumper в файл так, чтобы
SG>> нормально был виден русский текст, а не в виде юникодных кодов?
SG>> Делаю так:
SG>> use Encode;
SG>> use encoding "cp1251", STDOUT=>"cp866";
EP> (note для экспериментаторов, если такие есть, ессно) Заменить
EP> кодировку на местную. Пока не поправил было вообще весело.
В смысле? исходник в виндовой кодировке, вывод в консоль - в досовской. Просто
print "Русский тескст" норамльно отрабатывает.
SG>> $d->{russian}='Рашн текст';
SG>> #open F,">:utf8","sells";
SG>> open F,">:encoding(cp1251)","sells";
SG>> print F Data::Dumper->Dump([$d],['d']);
SG>> close F
SG>> в итоге в файле получаю:
SG>> 'russian' => "\x{420}\x{430}\x{448}\x{43d}
SG>> \x{442}\x{435}\x{43a}\x{441}\x{442}",
EP> (Subj должен был быть: "хочу странного") В общем, я обломался делать
EP> работающий пример. Печатаем вывод Dump в строку, проходим по строке с
EP> s{}{}ge, потом печатаем эту строку (с 'open F, ">:encoding"') должно
EP> взлететь.
EP> Однако, заменять надо на *internal encoding*.
Это как? ведь в строки-то так и хранятся во внутренней кодировке.
EP> Вот тут я и
EP> обломался. Или получается мусор или ничего не меняется.
С присваиванием в переменную вывод сабжа у меня тоже ничего не вышло...
SG>> А как получить исходный "Рашн текст" ?
EP> print "russian => $d->{russian}";
EP> Мне кажется, ты копаешь не в том направлении.
Предлагаешь переписать функционал Data::Dumper? не, неохота... :)
До скорых встреч, *Eric* С уважением, *Sergey*.
EP>> (note ��� �����������������, ���� ����� ����, �����) ��������
EP>> ��������� �� �������. ���� �� �������� ���� ������ ������.
SG> � ������? �������� � �������� ���������, ����� � ������� - �
SG> ���������. ������ print "������� ������" ��������� ������������.
��� slrn ���������� � utf8. �� � ��� ��������� ��� �������� �����.
*SKIP*
EP>> ������, �������� ���� �� *internal encoding*.
SG> ��� ���? ���� � ������-�� ��� � �������� �� ���������� ���������.
����� ������ ���� ���������� ���������.
EP>> ��� ��� � �
EP>> ���������. ��� ���������� ����� ��� ������ �� ��������.
SG> � ������������� � ���������� ����� ����� � ���� ���� ������ ��
SG> �����...
my $dump;
open my $fh, q|>|, \$dump or die $!;
print $fh Data::Dumper->Dump([$d],['d']);
SG>>> � ��� �������� �������� "���� �����" ?
EP>> print "russian => $d->{russian}";
EP>> ��� �������, �� ������� �� � ��� �����������.
SG> ����������� ���������� ���������� Data::Dumper? ��, �������... :)
��������� �������� perldoc YAML::Syck (���, perldoc YAML::Tiny (�����
��������������, ���� pure perl)).
EP> (Subj должен был быть: "хочу странного") В общем, я обломался делать
EP> работающий пример.
ничего странного. при отладке вебприложений очень часто хочется
сделать die Dumper и поглядеть что там внутри объектов. соответственно
русские символы хочется видеть правильными.
мы тоже извратнулись на эту тему написав свой регулярник после вызова
дампера.
EP> Печатаем вывод Dump в строку, проходим по строке с
EP> s{}{}ge, потом печатаем эту строку (с 'open F, ">:encoding"') должно
EP> взлететь. Однако, заменять надо на *internal encoding*. Вот тут я и
EP> обломался. Или получается мусор или ничего не меняется.
но с кодировками мы не парились, везде utf8 и все тут.
зачем сейчас лезть в поддержку не utf8? оно все равно помрет
... Природа мудра! у гомиков, либералов и прочих извращенцев обычно нет детей.
DEO> но с кодировками мы не парились, везде utf8 и все тут. зачем
DEO> сейчас лезть в поддержку не utf8? оно все равно помрет
Вообще-то напоминает чтение текста в cp866 с экрана в cp437. Неа? Со
временем научимся читать эти кракозябры напрямую.
В пятницу, 04 февраля 2011 года, в 11:52, ты писал(а) Eric Pozharski:
DEO> мы тоже извратнулись на эту тему написав свой регулярник после вызова
DEO> дампера.
Дай, пожалуйста, работающий пример такой регулярки. У меня не получилось
сделать.
До скорых встреч, *Dmitry* С уважением, *Sergey*.
DEO>> но с кодировками мы не парились, везде utf8 и все тут. зачем
DEO>> сейчас лезть в поддержку не utf8? оно все равно помрет
EP> Вообще-то напоминает чтение текста в cp866 с экрана в cp437. Hеа? Со
EP> временем научимся читать эти кракозябры напрямую.
суть в том что внутренности самого скрипта надо в любом случае делать
в utf8,
а вот со внешним миром можно общаться с установкой encoding'ов в
значение соответствующее локали. тогда можно думать только об utf8, а
о том как подать это пользователю можно уже не париться
... Слабый пол сильнее сильного в силу слабости сильного пола к слабому.
SG> � �������, 04 ������� 2011 ����, � 11:52, �� �����(�) Eric Pozharski:
DEO>> �� ���� ������������ �� ��� ���� ������� ���� ���������� ����� ������
DEO>> �������.
SG> ���, ����������, ���������� ������ ����� ���������. � ���� �� ����������
SG> �������.
$dump =~ s/(\\x\{[\da-fA-F]+\})/eval "qq{$1}"/eg;
����� ������� � ������� /ee ����������, �� ��� ���������� �����-�� ��
������ ���� � ��� ���������� ����� �������� ���������, � ���
������������ �� ������������, � ������ �� ����������� ����� ������ :)
��������� ������ ����� �����:
��� ����:
sub StringDumper
{
my $dump = Dumper(@_);
$dump =~ s/(\\x\{[\da-fA-F]+\})/eval "qq{$1}"/eg;
$dump;
}
my $test = {
���� => '��������',
};
print StringDumper $test;
print Dumper $test;
����������:
{
"����" => "��������"
}
{
"\x{442}\x{435}\x{441}\x{442}" =>
"\x{437}\x{43d}\x{430}\x{447}\x{435}\x{43d}\x{438}\x{435}"
}
... �������, ������, ������ ������!
DEO> суть в том что внутренности самого скрипта надо в любом случае
DEO> делать в utf8, а вот со внешним миром можно общаться с установкой
DEO> encoding'ов в значение соответствующее локали. тогда можно думать
DEO> только об utf8, а о том как подать это пользователю можно уже не
DEO> париться
Вот это как раз то, чего мне в понималке то и не хватало. Now, I feel
much better.