Forum Webscript.Ru

Программирование => Perl => Тема начата: GrAfF от 09 Апреля 2004, 13:33:20

Название: из win1251 в utf-8
Отправлено: GrAfF от 09 Апреля 2004, 13:33:20
Подскажите плиз, если кто знает.
Нужна пара строчек, которые сконвертят переменную из win1251 в utf-8.
Название: из win1251 в utf-8
Отправлено: NeoNox от 09 Апреля 2004, 13:41:55
perldoc Convert::Cyrillic
Название: из win1251 в utf-8
Отправлено: GrAfF от 09 Апреля 2004, 14:14:33
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. Помоги плиз именно парой строчек кода, если не трудно.
Мне нужно много файлов переконвертить, вчера утилы долго искал, ничего не нашел. Некоторые файлы даже Штирлиц не открывает. Пришлось писать скрипт, именно на этом моменте застрял.
Название: из win1251 в utf-8
Отправлено: Chs от 09 Апреля 2004, 16:11:11
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 $_;
}
Название: из win1251 в utf-8
Отправлено: NeoNox от 09 Апреля 2004, 16:36:31
Я не очень хорошо понимаю что значит содрал?
И почему не Convert::Cyrillic?
Название: из win1251 в utf-8
Отправлено: flymio от 09 Апреля 2004, 18:32:42
http://mio.itsoft.ru/pub/win2utf8/convert.pm.txt
save target as.
не помню откуда.
Название: из win1251 в utf-8
Отправлено: GrAfF от 12 Апреля 2004, 01:51:29
Chs, man recode у меня нет, ибо ВыньХП. А код правь или нет даже не создаёт 22.txt.

NeoNox, ноу док по Convert::Cyrillic. Нашел в HTML формате -  доках по Perl. Но там тёмный лес какой-то. Содрал - взял кусок чужого кода. :)

flymio, спасибо.

Что нужнос делать с символом, чтобы его потом выловить через регэксп с штукой вроде [\\x98] ?
Название: из win1251 в utf-8
Отправлено: GrAfF от 13 Апреля 2004, 15:09:00
И всё, никто ничем не поможет?

Я сейчас близок к одной мысли. Грубо и напролом. Читать исходный файл по байту, проверять восьмой бит и в соответствии с таблицей перекодировки писать по одному-двум байтам в utf-8.

И всё-таки, может кто-нибудь практически знает как вызывать в perl штуки для работы с unicode?
Название: из win1251 в utf-8
Отправлено: ThE0ReTiC от 13 Апреля 2004, 15:12:23
GrAfF
http://www.freebsd.org/cgi/man.cgi?query=recode&apropos=0&sektion=1&manpath=FreeBSD+5.2-RELEASE+and+Ports&format=html
Название: из win1251 в utf-8
Отправлено: GrAfF от 13 Апреля 2004, 15:44:46
Будете долго смеяться, говорить: "Я так и знал" и покачивать головой. В общем, perl запускался из папки с урезанный дистрибутивом. Сейчас всё с Encode заработало.
Хотя путь с восьмым битом кажется интереснее. :)
Название: из win1251 в utf-8
Отправлено: GrAfF от 14 Апреля 2004, 03:14:49
Пока получилась такая гадость:

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 - какая-то ерунда выходит.
Название: из win1251 в utf-8
Отправлено: NeoNox от 14 Апреля 2004, 12:10:28
GrAfF
что бы гадости не получалось пишем под use strict.
далее... binmode OUT, utf8; что это?!
Цитировать
GrAfF:
NeoNox, ноу док по Convert::Cyrillic.

А это что такое?
http://search.cpan.org/~jneystadt/cyrillic-1.05/Convert/Cyrillic.pm
Название: из win1251 в utf-8
Отправлено: ondr от 14 Апреля 2004, 14:32:59
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
порядок соблюдать
Название: из win1251 в utf-8
Отправлено: GrAfF от 14 Апреля 2004, 17:04:04
Вскрываем карты. Триллиан (клон 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. "И вообще" я вчера как раз и читал. Похоже, бесполезно. :)
Название: из win1251 в utf-8
Отправлено: NeoNox от 14 Апреля 2004, 18:04:15
Цитировать
GrAfF:
ночью читал, не выспался, забыл уже что это такое.

Перечитай, в чем вопрос?
Название: из win1251 в utf-8
Отправлено: GrAfF от 14 Апреля 2004, 18:35:34
NeoNox, сдаюсь. Полез на CPAN за нужными модулями. О результатах сообщу дополнительно..
Название: из win1251 в utf-8
Отправлено: GrAfF от 19 Апреля 2004, 07:04:14
В общем, сомневаюсь что получится поставить Cyrillic на мой Active Perl. Получается, нужно через побайтную перекодировку.
Название: из win1251 в utf-8
Отправлено: NeoNox от 19 Апреля 2004, 12:38:00
Цитировать
GrAfF:
В общем, сомневаюсь что получится поставить Cyrillic на мой Active Perl.

в чем проблема?
не знаеш как поставить модуль с cpan на activestat-овский perl?
загляни в фак по этому форуму.
Название: из win1251 в utf-8
Отправлено: GrAfF от 19 Апреля 2004, 21:43:54
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.
Название: из win1251 в utf-8
Отправлено: Chs от 20 Апреля 2004, 10:07:23
Цитировать
Закопировал.

Вот именно что "закопировал", забыв при этом про бинарную и подгружаемую часть модулей.
Ставить надо вообще-то, а не копировать.
Название: из win1251 в utf-8
Отправлено: NeoNox от 20 Апреля 2004, 11:02:33
Хоть сто раз напиши что фак это рулез, нет, всегда будем на своей шкуре испытывать...
http://faq.webscript.ru/PFPerlActive?v=nqp
Название: из win1251 в utf-8
Отправлено: GrAfF от 20 Апреля 2004, 16:17:06
NeoNox, фак-то рулез. Я его уже читал. Давно А лог ошибок искал в поисковых системах. Даже нашел битую ссылку на бинарник Map8 в Сети. Которого нет нигде, даже в пиринговых.

Chs, как раз в факе советуется попробовать закопировать? IMHO проблемы в Map8. "Подгружаемая" - это maps? Всё там на месте. "Бинарную", похоже, нужно компилять? Так? И будет Щастъе?
Название: из win1251 в utf-8
Отправлено: NeoNox от 20 Апреля 2004, 18:42:05
Цитировать
GrAfF:
Даже нашел битую ссылку на бинарник Map8 в Сети. Которого нет нигде, даже в пиринговых.

так не пойдет.
я тебя уже вторую страницу пытаюсь натолкнуть на мысль что нужно взять этот модуль с cpan и собрать на своей машине.
Название: из win1251 в utf-8
Отправлено: Chs от 20 Апреля 2004, 20:02:26
Можно автивстейтовский поставить.

Для тех кто в танке: некоторые модули имеют бинарную часть, которая располагается в директории auto для каждого модуля. Т.е. скопировать можно, но нужно знать что и куда.:) Просто копированием pm не обойдешься.
Название: из win1251 в utf-8
Отправлено: GrAfF от 21 Апреля 2004, 00:12:07
Chs, бинарной части у Map8 как-то не заметил, auto тем более.
На Активстейте есть Map8, но под Win он ещё не работает.

Я понял, что собрать. Буду пробовать.

[OFF](Вообще обычно пишу сюда когда больше нигде ответов не нашлось. Ни в факах, ни в гугляндексе. Кстати, тут все под *nix\'ами сидят? Такое ощущение есть.)[/OFF]
Название: из win1251 в utf-8
Отправлено: GrAfF от 21 Апреля 2004, 07:31:10
Нашел в Сети Unicode-Map8.tar.gz от апача под win. Закопировал auto в auto, Map8 в Unicode. Запустил свой скрипт. Всплыло окошко, что не хватает Perl56.dll. Нашел, закопировал. Скрипт запустился, поработал и вышел. Ни ошибок, ни полезной работы. Вообще ничего.
Название: из win1251 в utf-8
Отправлено: Mog. от 21 Апреля 2004, 08:14:51
Цитировать
GrAfF:
все под *nix\'ами сидят?
Отнюдь! Очевидно только профи.
Название: из win1251 в utf-8
Отправлено: Chs от 21 Апреля 2004, 09:22:15
Unicode::Map8 есть на активстейте, и под винды он работал, правда это давно было.
Название: из win1251 в utf-8
Отправлено: GrAfF от 21 Апреля 2004, 10:54:29
Chs, там в таблицах указано, что не работет. :(

Скачал компилятор gcc, натравил его на map8x.c. Выдалось три экрана ошибок.
Похоже, не будет у меня на машине Map8.
Название: из win1251 в utf-8
Отправлено: NeoNox от 21 Апреля 2004, 12:13:06
GrAfF
это только начало.
Ты gcc на винде запускал?
Название: из win1251 в utf-8
Отправлено: GrAfF от 21 Апреля 2004, 12:45:29
Да. Распаковал архивы. В 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
Название: из win1251 в utf-8
Отправлено: NeoNox от 21 Апреля 2004, 13:39:42
Вот ты мне покажи где в ФАКе написано что нужно тянуть gcc???
Вот, наслаждайся:
http://perlmonks.thepen.com/249803.html
Название: из win1251 в utf-8
Отправлено: GrAfF от 24 Апреля 2004, 06:33:05
[OFF]Может быть кто-нибудь смог бы скомпилировать модуль и скинуть мне. Плииииз.[/OFF]
Название: из win1251 в utf-8
Отправлено: GrAfF от 25 Апреля 2004, 11:00:28
Скачал и поставил 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.
Название: из win1251 в utf-8
Отправлено: Phoinix от 26 Апреля 2004, 11:23:15
GrAfF

http://forums.webscript.ru/showthread.php?s=&postid=106803#post106803

Устанавливай через ppm, только репозитарий настрой...
Название: из win1251 в utf-8
Отправлено: GrAfF от 08 Мая 2004, 16:35:01
В общем, через ppm чтоже не получается.
Нашел Map8 с dll, поставил.
Если в скрипте есть строка
use Lingua::DetectCharset;
никаких ошибок не выводится насчет Map8, но и скрипт вооще не делает никаких действий. Может в этом направлнии как-то покопать?