Forum Webscript.Ru
Программирование => Perl => Тема начата: GrAfF от 09 Апреля 2004, 13:33:20
-
Подскажите плиз, если кто знает.
Нужна пара строчек, которые сконвертят переменную из win1251 в utf-8.
-
perldoc Convert::Cyrillic
-
use Encode;
$infile = "11.txt";
$outfile = "22.txt";
# via from_to
open my $in, "<", $infile or die;
open my $out, ">", $outfile or die;
while(<$in>){
from_to($_, "cp1251", "utf8", 1);
print $out $_;
}
NeoNox, cодрал код из Encode.html. Но даже не создаётся outfile. Помоги плиз именно парой строчек кода, если не трудно.
Мне нужно много файлов переконвертить, вчера утилы долго искал, ничего не нашел. Некоторые файлы даже Штирлиц не открывает. Пришлось писать скрипт, именно на этом моменте застрял.
-
man recode?
а если код править, то так:
use Encode;
$infile = "11.txt";
$outfile = "22.txt";
# via from_to
open(IN, "<", $infile) or die $!;
open(OUT, ">", $outfile) or die $!;
while( ){
from_to($_, "cp1251", "utf8", 1);
print OUT $_;
}
-
Я не очень хорошо понимаю что значит содрал?
И почему не Convert::Cyrillic?
-
http://mio.itsoft.ru/pub/win2utf8/convert.pm.txt
save target as.
не помню откуда.
-
Chs, man recode у меня нет, ибо ВыньХП. А код правь или нет даже не создаёт 22.txt.
NeoNox, ноу док по Convert::Cyrillic. Нашел в HTML формате - доках по Perl. Но там тёмный лес какой-то. Содрал - взял кусок чужого кода. :)
flymio, спасибо.
Что нужнос делать с символом, чтобы его потом выловить через регэксп с штукой вроде [\\x98] ?
-
И всё, никто ничем не поможет?
Я сейчас близок к одной мысли. Грубо и напролом. Читать исходный файл по байту, проверять восьмой бит и в соответствии с таблицей перекодировки писать по одному-двум байтам в utf-8.
И всё-таки, может кто-нибудь практически знает как вызывать в perl штуки для работы с unicode?
-
GrAfF
http://www.freebsd.org/cgi/man.cgi?query=recode&apropos=0&sektion=1&manpath=FreeBSD+5.2-RELEASE+and+Ports&format=html
-
Будете долго смеяться, говорить: "Я так и знал" и покачивать головой. В общем, perl запускался из папки с урезанный дистрибутивом. Сейчас всё с Encode заработало.
Хотя путь с восьмым битом кажется интереснее. :)
-
Пока получилась такая гадость:
use Encode qw/encode decode/;
open (DATA, "$_") or die "$!";
open(OUT, ">done\\\\$_") or die $!;
binmode OUT, utf8;
print OUT ($hdr);
while () {
chomp;
$tmp = decode("cp1251", $_);
print OUT ($tmp . "\\n");
}
close DATA;
close OUT;
Весь день сегодня переписывал этот скрипт с использованием разных способов. Ничего хорошего не получается.
Вопрос в тему: как из символа получить его код в двоичном или hex формате? Пробовал играть с pack - какая-то ерунда выходит.
-
GrAfF
что бы гадости не получалось пишем под use strict.
далее... binmode OUT, utf8; что это?!
GrAfF:
NeoNox, ноу док по Convert::Cyrillic.
А это что такое?
http://search.cpan.org/~jneystadt/cyrillic-1.05/Convert/Cyrillic.pm
-
GrAfF
Дело в том что изначально у вас был относительно верный вариант. И не работал он скорее всего из-за этого "Но даже не создаётся outfile". Что никак с перекодировкой не связанно.
Для того, чтобы заработал второй вариант вот рекомендации:
1. Ну самое важное замечание в обоих вариантах - не включены сообщения об ошибках;
2. Справьте "binmode(OUT, utf8)"; на "binmode(OUT, \':utf8\');"
3. Убедитесь что версия perl 5.8.0 или лучше 5.8.1 или выше. Если ниже, то из здесь описанных, вам пойдет только вариант NeoNox\'а.
4. Мелочь: вам не кажется бессмысленным рубить "\\n" и тут же его добавлять? ;)
ps: для данной задачи первый вариант предпочтительнее. Разберитесь с проблемой открытия файлов.
и вообще
perldoc strict
perldoc warnings
perldoc perlunitut
perldoc perlunicode
perldoc utf8
perldoc Encode
perldoc -f binmode
порядок соблюдать
-
Вскрываем карты. Триллиан (клон ICQ) хранил логи сообщений в cp1251, с новой версии он же пишет в те же логи utf8.
Возникла необходимость переконвертить. Ни одна найденная утила файлы пачкой перекодировать не хотела, а руками не хотелось мне.
Я некоторое время апологетил BeOS, там понял что такое utf8 и чем он отличается от однобайтных кодировок.
Думал, перекод на Перле уместится в пару-тройку строк. Даже заранее нарыл perl2exe чтобы раздать перекодировщик знакомым, которые из-за несовместимости базы не спешат переходить.
Хотелось сделать всё самому, найти в логах восьмибайтные символы и переписать их двумя байтами utf8. Плюс добавить трёхбайтный header к txt файлу, чтобы он опозновался как utf8 (как это работает так и не понял).
Трабла в том, что уже поздно перекодировать строчками, логи у меня уже разбавлены utf8 и лучше было бы побайтно заменить все cp1251.
Поэтому вопрос формулируется так: как узнать двоичный или hex код символа. С pack ничего у меня не получилось. Доки читал, но реультат совершенно не тот, что мне кажется был должен получится.
NeoNox, binmode OUT, utf8 как-то хитро пишет в файл с нужными crlf. Я ночью читал, не выспался, забыл уже что это такое. :)
ondr, он 5.8.0. Рубить "\\n" приходится для подстаховки, ведь chomp удаляет все переносы строки, неважно, unix или win. "И вообще" я вчера как раз и читал. Похоже, бесполезно. :)
-
GrAfF:
ночью читал, не выспался, забыл уже что это такое.
Перечитай, в чем вопрос?
-
NeoNox, сдаюсь. Полез на CPAN за нужными модулями. О результатах сообщу дополнительно..
-
В общем, сомневаюсь что получится поставить Cyrillic на мой Active Perl. Получается, нужно через побайтную перекодировку.
-
GrAfF:
В общем, сомневаюсь что получится поставить Cyrillic на мой Active Perl.
в чем проблема?
не знаеш как поставить модуль с cpan на activestat-овский perl?
загляни в фак по этому форуму.
-
NeoNox
Закопировал. Модули находятся и почти запускаются. Но потом вылетает. Система XP. Вообще у UTF-8 есть похожие на C файлы, что-то в Changes написано: "Make it compile with perl-5.003 and on Windows." Не понятно, нужен ли там Си компилятор.
Can\'t locate loadable object for module Unicode::Map8 in @INC (@INC contains: C:
/Perl/lib C:/Perl/site/lib .) at C:/Perl/lib/Convert/Cyrillic.pm line 24
Compilation failed in require at C:/Perl/lib/Convert/Cyrillic.pm line 24.
BEGIN failed--compilation aborted at C:/Perl/lib/Convert/Cyrillic.pm line 24.
Compilation failed in require at C:/Perl/lib/Lingua/DetectCharset.pm line 20.
BEGIN failed--compilation aborted at C:/Perl/lib/Lingua/DetectCharset.pm line 20.
Compilation failed in require at last.pl line 1.
BEGIN failed--compilation aborted at last.pl line 1.
-
Закопировал.
Вот именно что "закопировал", забыв при этом про бинарную и подгружаемую часть модулей.
Ставить надо вообще-то, а не копировать.
-
Хоть сто раз напиши что фак это рулез, нет, всегда будем на своей шкуре испытывать...
http://faq.webscript.ru/PFPerlActive?v=nqp
-
NeoNox, фак-то рулез. Я его уже читал. Давно А лог ошибок искал в поисковых системах. Даже нашел битую ссылку на бинарник Map8 в Сети. Которого нет нигде, даже в пиринговых.
Chs, как раз в факе советуется попробовать закопировать? IMHO проблемы в Map8. "Подгружаемая" - это maps? Всё там на месте. "Бинарную", похоже, нужно компилять? Так? И будет Щастъе?
-
GrAfF:
Даже нашел битую ссылку на бинарник Map8 в Сети. Которого нет нигде, даже в пиринговых.
так не пойдет.
я тебя уже вторую страницу пытаюсь натолкнуть на мысль что нужно взять этот модуль с cpan и собрать на своей машине.
-
Можно автивстейтовский поставить.
Для тех кто в танке: некоторые модули имеют бинарную часть, которая располагается в директории auto для каждого модуля. Т.е. скопировать можно, но нужно знать что и куда.:) Просто копированием pm не обойдешься.
-
Chs, бинарной части у Map8 как-то не заметил, auto тем более.
На Активстейте есть Map8, но под Win он ещё не работает.
Я понял, что собрать. Буду пробовать.
[OFF](Вообще обычно пишу сюда когда больше нигде ответов не нашлось. Ни в факах, ни в гугляндексе. Кстати, тут все под *nix\'ами сидят? Такое ощущение есть.)[/OFF]
-
Нашел в Сети Unicode-Map8.tar.gz от апача под win. Закопировал auto в auto, Map8 в Unicode. Запустил свой скрипт. Всплыло окошко, что не хватает Perl56.dll. Нашел, закопировал. Скрипт запустился, поработал и вышел. Ни ошибок, ни полезной работы. Вообще ничего.
-
GrAfF:
все под *nix\'ами сидят?
Отнюдь! Очевидно только профи.
-
Unicode::Map8 есть на активстейте, и под винды он работал, правда это давно было.
-
Chs, там в таблицах указано, что не работет. :(
Скачал компилятор gcc, натравил его на map8x.c. Выдалось три экрана ошибок.
Похоже, не будет у меня на машине Map8.
-
GrAfF
это только начало.
Ты gcc на винде запускал?
-
Да. Распаковал архивы. В C:\\djgpp. Прописал PATH и ENV. Система WinXP, всё это делалолось в FAR\'е.
Вытянул с сайта
unzip32.exe to unzip the zip files 95 kb
v2/copying.dj DJGPP Copyright info 3 kb
v2/djdev203.zip DJGPP Basic Development Kit 1.5 mb
v2/faq230b.zip Frequently Asked Questions 664 kb
v2/pakk023b.zip Pakke Installer 1,017 kb
v2/readme.1st Installation instructions 22 kb
v2apps/rhid149b.zip RHIDE 2.4 mb
v2gnu/bnu214b.zip Basic assembler, linker 3.1 mb
v2gnu/gcc333b.zip Basic GCC compiler 2.8 mb
v2gnu/gdb53b.zip GNU debugger 1.5 mb
v2gnu/gpp333b.zip C++ compiler 2.8 mb
v2gnu/mak3791b.zip Make (processes makefiles) 267 kb
v2gnu/txi46b.zip Info file viewer 761 kb
-
Вот ты мне покажи где в ФАКе написано что нужно тянуть gcc???
Вот, наслаждайся:
http://perlmonks.thepen.com/249803.html
-
[OFF]Может быть кто-нибудь смог бы скомпилировать модуль и скинуть мне. Плииииз.[/OFF]
-
Скачал и поставил Microsoft Visual C++ Toolkit 2003, nmake стянул откуда-то с сайта микрософта. Недостающие .h нашлись тоже в Сети.
Теперь ошибки такие:
cl -c -nologo -Gf -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX -MD -Zi -DNDEBUG -O1 -DVERSION=\\"0.12\\" -DXS_VERSION=\\ "0.12\\" "-IC:\\Perl\\lib\\CORE" -DPERL Map8.c
Map8.c
c1 : warning C4349: /Gf is deprecated and will not be supported in future versions of Visual C++; remove /Gf or use /GF instead
C:\\Perl\\lib\\CORE\\winnt.h(6775) : error C2061: syntax error : identifier \'DWORDulSize\'
C:\\Perl\\lib\\CORE\\winnt.h(6779) : error C2059: syntax error : \'}\'
Map8.xs(164) : warning C4244: \'function\' : conversion from \'IV\' to \'u_short\', possible loss of data
Map8.xs(166) : warning C4244: \'=\' : conversion from \'IV\' to \'U16\', possible loss of data
Map8.xs(359) : warning C4013: \'map8_recode8\' undefined; assuming extern returning int
NMAKE : fatal error U1077: \'C:\\WINXP\\system32\\cmd.exe\' : return code \'0x2\'
Stop.
-
GrAfF
http://forums.webscript.ru/showthread.php?s=&postid=106803#post106803
Устанавливай через ppm, только репозитарий настрой...
-
В общем, через ppm чтоже не получается.
Нашел Map8 с dll, поставил.
Если в скрипте есть строка
use Lingua::DetectCharset;
никаких ошибок не выводится насчет Map8, но и скрипт вооще не делает никаких действий. Может в этом направлнии как-то покопать?