[perl] win1251 -> utf8 как перекодировать?

Biglem

кто знает как на перл написать перекодирование символов аналогичное iconv -f cp1251 -t utf8 ?
проблема в том, что можно пользоваться только самым базовым perl'ом - никаких библиотек нет
надо это решить либо через pack/unpack, либо через тупую табличную перекодировку или регулярные выражения
у меня почему-то не работает мой вариант:
$str =~ tr/абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯїЇєіІґҐўЎёЁЄ/\0\xB0\0\xB1\0\xB2\0\xB3\(И.Т.Д)/;
выводит крокозяблы
может кто-нибудь написать рабочий вариант?

uncle17

Вот обратная, которая у меня на сайте фунциклирует

sub utf82win1251 {
    my $mess=shift;
    my %conv='';
my @utf8=('\0\xB0','\0\xB1','\0\xB2','\0\xB3','\0\xB4',
     '\0\xB5', '\1\x91','\0\xB6','\0\xB7','\0\xB8',
     '\0\xB9','\0\xBA','\0\xBB','\0\xBC', '\0\xBD',
     '\0\xBE','\0\xBF','\1\x80','\1\x81','\1\x82',
     '\1\x83','\1\x84', '\1\x85','\1\x86','\1\x87',
     '\1\x88','\1\x89','\1\x8A','\1\x8B','\1\x8C',
     '\1\x8D','\1\x8E','\1\x8F','\0\x90','\0\x91',
     '\0\x92','\0\x93','\0\x94', '\0\x95','\0\x81',
     '\0\x96','\0\x97','\0\x98','\0\x99','\0\x9A',
     '\0\x9B', '\0\x9C','\0\x9D','\0\x9E','\0\x9F',
     '\0\xA0','\0\xA1','\0\xA2','\0\xA3', '\0\xA4',
     '\0\xA5','\0\xA6','\0\xA7','\0\xA8','\0\xA9',
     '\0\xAA','\0\xAB', '\0\xAC','\0\xAD','\0\xAE',
     '\0\xAF','\1\x97','\0\x87','\1\x94','\1\x96',
     '\0\x86','\2\x91','\2\x90','\1\x9E','\0\x8E',
     '\1\x91','\0\x81','\0\x84');
my @win=('Ю','А','Б','Ц','Д','Е','╦','Ф','Г','Х','И','Й','К','Л','М',
     'Н','О','П','Я','Р', 'С','Т','У','Ж','В','Ь','Ы','З','Ш','Э',
     'Щ','Ч','Ъ','ю','а','б','ц','д','е','╗', 'ф', 'г','х','и','й',
     'к','л','м','н', 'о','п','я','р','с','т','у','ж','в','ь','ы',
     'з','ш','э','щ','ч','ъ','©','╞','╨', 'Ё' ,'╡','Є','╔','╒','║','╦','╗','╙');
no strict;
{
@hash{@utf8}=@win;
%conv=%hash;
}
foreach my $sym(keys %conv) {
    $mess=~s/$sym/$conv{$sym}/g;
}
return $mess;
}

Biglem

ага
на этот баян я тоже натыкался
но вот в обратную сторону он почему-то у меня не заработал
надо ещё раз попробовать

Biglem

не работает ;(
выводит все эти \0\x9B\0\xA5 прям так в win1251 видимо

Sharp

а использовать p5-Text-Iconv что мешает?
Iconv(3)              User Contributed Perl Documentation             Iconv(3)
NAME
Text::Iconv - Perl interface to iconv codeset conversion function
SYNOPSIS
use Text::Iconv;
$converter = Text::Iconv->new("fromcode", "tocode");
$converted = $converter->convert("Text to convert");
DESCRIPTION
The Text::Iconv module provides a Perl interface to the iconv func-
tion as defined by the Single UNIX Specification. The convert method
converts the encoding of characters in the input string from the from-
code codeset to the tocode codeset, and returns the result.
Settings of fromcode and tocode and their permitted combinations are
implementation-dependent. Valid values are specified in the system
documentation

Biglem

на этой платформе нет ;(

Sharp

Если это Windows, то есть iconv и для Windows .
Ну а сам p5-Text-Iconv - это просто Perl, ему все равно на какой платформе пускаться.
p.s.
если что, то в PHP есть встроенные функции для конвертации.

Biglem

это роутер
под линуксом
но полноценного пёрла туда не перенесли
и iconv пока что тоже сломан
есть microperl, который в общем-то, заменяет perl по функциональности, но не имеет никаких модулей (просто бинарник и всё)
есть ruby, но тоже довольно обрезанный
есть bash
есть php, но не знаю в каком виде - ещё не ставил
просто из-за скрипта ставить на роутер php не хочется
Оставить комментарий
Имя или ник:
Комментарий: