LINUX.ORG.RU

Perl. Конвертация json в хеш. Юникод проблема.

 , , , ,


0

1

Всем привет. Подскажите, люди добрые, почему при конвертации json в хеш, данные становятся не в utf8?

open(my $in_file, "<:encoding(UTF-8)", "file.json") or die;
# Считываю из json-файла и аккумулирую в скаляр
while (my $row = <$in_file>) {
	$f .= encode("utf8", $row);
}
close($in_file);
print $f; # Тут нормальный юникод			
my %h = %{ JSON::XS->new->pretty(1)->utf8(1)->decode($f) };
print Dumper \$h; # Тут уже нет


Последнее исправление: Sektor (всего исправлений: 1)

Тут нормальный юникод

Что значит «нормальный»? Бывает ненормальный юникод?

Тут уже нет

А что там?

outtaspace ★★★
()
use strict;
use warnings;
use 5.10.1;
use Data::Dumper;

binmode STDOUT, ':utf8';

# тут символы,
# юникодные данные во внутреннем представлении Perl
my $content; 
{
    open my $in_file, '<', 'file.json';
    binmode $in_file, ':utf8';
    $/ = undef;
    $content = <$in_file>;
}

say $content;        # вап
say Dumper $content; # \x{432}\x{430}\x{43f}
outtaspace ★★★
()
# тут тоже все норм
say Dumper(JSON::XS->new->decode($content));
outtaspace ★★★
()
Ответ на: комментарий от outtaspace

т.ь. как конвертироват юникодные данные во внутреннем представлении Perl в нормальный utf8?

Sektor
() автор топика
Ответ на: комментарий от outtaspace

человекочетабельные символы, а не \x{...}

Sektor
() автор топика
Ответ на: комментарий от outtaspace

Нифига не работает сброс флага utf. После сериализации json в хеш как были крокозябры, так и остались.

my %object = %{JSON::XS->new->decode( decode("UTF-8", $jobj) )};

Кто-нибудь вообще конвертировал json в хеш в перле. Как проблему кодировок побеждали?

Sektor
() автор топика
Ответ на: комментарий от Sektor

Нифига не работает сброс флага utf.

Сброс флага безусловно работает. Просто ты феерически глуп. Если бы почитал доки, на которые я ссылался, посмеялись бы вместе над твоей глупостью.

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

_utf8_off - работает только для строки. А у меня тут структура - хеш. Так что, да, сброс флага, безусловно, работает. Но мне от этого что?

Sektor
() автор топика
Ответ на: комментарий от outtaspace

Просто ты феерически глуп. Если бы почитал доки, на которые я ссылался, посмеялись бы вместе над твоей глупостью.

Если ты такой крутой, то давай, запости сюда код для конвертации json, считанного из файла, в хеш, с читабельным юникодом. Наверняка, для такого мастодонта перала как ты, это раз плюнуть.

Sektor
() автор топика
Ответ на: комментарий от Sektor

с читабельным юникодом

Ололо.

Если ты такой крутой, то давай

Не, ты почитай perldoc perlunicode, показываю свои скилы только на работе - за деньги.

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

Фигассе. А я и не знал, что для json'а в перле с юникодом надо ещё делать каие-то телодвижения помимо описанных в мане.

shell-script ★★★★★
()

Это фича Data::Dumper, забей.

#!/usr/bin/perl -w

use strict;
use JSON::XS;
use Encode ();

my $file = $ARGV[0] || 'file.json';

open ( my $fh, "<:raw", $file )
  or die "open $file: $!";

my $text = do { local $/; <$fh> };

close $fh;

my $p5 = JSON::XS->new->decode( $text );

# p5 internal unicode
# no warnings about Wide characters
printf "%s = %s [p5]\n", $_, $p5->{ $_ } for keys %$p5;

my $unicode = JSON::XS->new->decode( &Encode::decode_utf8($text) );
            # the same as JSON::XS->new->utf8(1)->decode( $text );

{
  binmode STDOUT, ":utf8";
  printf "%s = %s [utf8]\n", $_, $unicode->{ $_ } for keys %$unicode;
}

{
  use utf8;
  use Data::Dumper;
  print Dumper { "тест" => "Dumper плохой" };
}

Как ни крути, а Data::Dumper не проведешь. Если Dumper начнет выводить текст как есть, то это уже не будет дампов (такие дела, спроси у разрабов на RT, пусть фичей сделают//вернут все взад).

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.