URL: https://ssl.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10150
[ Назад ]

Исходное сообщение
"Преобразование уникода"

Отправлено abut , 18-Фев-17 18:47 
Подскажите пжста, как на перл перекодировать в читаемый вид уникод-строку типа \u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439

Содержание

Сообщения в этом обсуждении
"Преобразование уникода"
Отправлено михалыч , 19-Фев-17 05:06 
> Подскажите пжста, как на перл перекодировать в читаемый вид уникод-строку типа \u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439

#!/usr/bin/perl

use Encode;

$text='\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
print Encode::from_to($text,'utf8','koi8r');

60

"Преобразование уникода"
Отправлено abut , 19-Фев-17 10:56 
>> Подскажите пжста, как на перл перекодировать в читаемый вид уникод-строку типа \u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439
>
#!/usr/bin/perl 
> use Encode;
> $text='\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
> print Encode::from_to($text,'utf8','koi8r');
60

сорри, я наверно как то сформулировал не так.
Нужно получить в той же кодировке (utf8),  но в читабельном виде, в строке на самом деле слово "Люберецкий", а ваш скрипт выдает видимо количество символов в строке :).


"Преобразование уникода"
Отправлено PavelR , 19-Фев-17 11:01 

Чтобы вывести текст надо вывести измененное содержимое переменной $text.

print $text;


"Преобразование уникода"
Отправлено Andrey Mitrofanov , 19-Фев-17 11:52 
> #!/usr/bin/perl
> use Encode;
> $text='\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
> Encode::from_to($text,'utf8','koi8r');
> print $text;

И это опять не подойдёт Заказчику?

echo '\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439' |SOME_SECRET_COMMAND ; echo
Люберецкий
$ _


--- sed '/g ; s/, //'|recode u2/x2..


"Преобразование уникода"
Отправлено PavelR , 19-Фев-17 11:53 

Да, чего-то не подходит. )


"Преобразование уникода"
Отправлено Andrey Mitrofanov , 19-Фев-17 11:54 
> Люберецкий
> $ _
> --- sed '/g ; s/, //'|recode u2/x2..

--агхр sed 's/\\u/, 0x/g ; s/, //'|recode u2/x2..


"Преобразование уникода"
Отправлено abut , 19-Фев-17 12:10 
>> Люберецкий
>> $ _
>> --- sed '/g ; s/, //'|recode u2/x2..
> --агхр sed 's/\\u/, 0x/g ; s/, //'|recode u2/x2..

да хотелось бы именно на перл и без вызова внешних программ.
На питоне в 2 строчки делается, а на перле чет не могу найти работающего решения(


"Преобразование уникода"
Отправлено abut , 22-Фев-17 15:22 
>> Люберецкий
>> $ _
>> --- sed '/g ; s/, //'|recode u2/x2..
> --агхр sed 's/\\u/, 0x/g ; s/, //'|recode u2/x2..

Спасибо, пришлось все же воспользоваться Вашим решением,
единственно что для recode добавил флаг f, иначе ошибка "recode: Ambiguous output in step `Hexadecimal-2..data"

# echo '\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439' | sed 's/\\u/, 0x/g ; s/, //' | recode -f u2/x2 ; echo
Люберецкий


"Преобразование уникода"
Отправлено Andrey Mitrofanov , 22-Фев-17 16:35 
>>> --- sed '/g ; s/, //'|recode u2/x2..
>> --агхр sed 's/\\u/, 0x/g ; s/, //'|recode u2/x2..
> Спасибо, пришлось все же воспользоваться Вашим решением,

|-D  "Ещё долго седые опенетовцы рассказывли детям предания, как Митрофанов заборол перлы-питоны-повершелы одним ядрёным баш-сед-фу."

> единственно что для recode добавил флаг f, иначе ошибка "recode: Ambiguous output


"Преобразование уникода"
Отправлено михалыч , 19-Фев-17 11:57 
> Чтобы вывести текст надо вывести измененное содержимое переменной $text.
> print $text;

да конечно! посыпаю голову пеплом ))


"Преобразование уникода"
Отправлено михалыч , 19-Фев-17 20:52 
>>> Подскажите пжста, как на перл перекодировать в читаемый вид уникод-строку типа \u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439
>>
#!/usr/bin/perl 
>> use Encode;
>> $text='\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
>> print Encode::from_to($text,'utf8','koi8r');
60

> сорри, я наверно как то сформулировал не так.
> Нужно получить в той же кодировке (utf8),  но в читабельном виде,
> в строке на самом деле слово "Люберецкий", а ваш скрипт выдает
> видимо количество символов в строке :).

виноват, исправляюсь ))

#!/usr/bin/perl

use Text::Iconv;

$text = '\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
print Text::Iconv->new("java", "koi8-r")->convert($text);

у вас какой-то юникод неправильный (смс-ки вроде как в ucs-2be или это не для рассылок смс?)


"Преобразование уникода"
Отправлено abut , 22-Фев-17 15:19 
> виноват, исправляюсь ))
#!/usr/bin/perl 
> use Text::Iconv;
> $text = '\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
> print Text::Iconv->new("java", "koi8-r")->convert($text);

> у вас какой-то юникод неправильный (смс-ки вроде как в ucs-2be или это
> не для рассылок смс?)

не могу проверить, на хостинге модуль Text::Iconv отсутствует, но похоже что это тоже не то.

не для рассылок смс, это из инстаграма


"Преобразование уникода"
Отправлено михалыч , 22-Фев-17 20:16 
сам iconv есть? тогда
#!/usr/bin/perl

$text = '\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';

$text = `iconv -f java -t koi8-r << EOD
$text`;
print $text;

а на хостинге по просьбе трудящихся ничего дополнительно не установят?
попросите их вежливо ))


"Преобразование уникода"
Отправлено abut , 22-Фев-17 20:45 
> сам iconv есть? тогда
#!/usr/bin/perl 
> $text = '\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
> $text = `iconv -f java -t koi8-r << EOD
> $text`;
> print $text;

> а на хостинге по просьбе трудящихся ничего дополнительно не установят?
> попросите их вежливо ))

------------8<--------------------------------------
sh: line 1: warning: here-document at line 0 delimited by end-of-file (wanted `EOD')
iconv: conversion from `java' is not supported
Try `iconv --help' or `iconv --usage' for more information.
----------->8---------------------------------------


Спасибо, я уже решил проблему вызовом из перла sed+recode с помощью совета выше.


"Преобразование уникода"
Отправлено ACCA , 01-Мрт-17 22:02 
> Спасибо, я уже решил проблему вызовом из перла sed+recode с помощью совета
> выше.

Не нужно вызывать sed+recode из Perl, это извращение в три процесса на строку.

my $text='\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
$text =~ s/\\u(....)/chr hex $1/ge;


"Преобразование уникода"
Отправлено михалыч , 06-Мрт-17 09:58 
> my $text='\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
> $text =~ s/\\u(....)/chr hex $1/ge;

класс! это здо́рово! спасибо за пример использования chr и hex

тем самым получаем текст в utf8

если необходимо, то переводим полученный текст в нужную кодировку
например вот так в koi8-r
(не-не, я только перекодирование добавлю, петь и плясать не буду ☺ )

#!/usr/bin/perl

use Encode qw(encode decode);

$text='\u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439';
$text =~ s/\\u(....)/chr hex $1/ge;

$text = Encode::encode('koi8-r', $text);
print $text;


на пальму первенства не претендую ))

"Преобразование уникода"
Отправлено Аноним , 11-Июл-18 21:37 
> Подскажите пжста, как на перл перекодировать в читаемый вид уникод-строку типа \u041b\u044e\u0431\u0435\u0440\u0435\u0446\u043a\u0438\u0439

s/\\u(....)/ pack 'U*', hex($1) /eg;