Автор Тема: из win1251 в utf-8  (Прочитано 15655 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
из win1251 в utf-8
« : 09 Апреля 2004, 13:33:20 »
Подскажите плиз, если кто знает.
Нужна пара строчек, которые сконвертят переменную из win1251 в utf-8.
WBR, GrAfF.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
из win1251 в utf-8
« Ответ #1 : 09 Апреля 2004, 13:41:55 »
perldoc Convert::Cyrillic
The documentations is your friend

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
из win1251 в utf-8
« Ответ #2 : 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. Помоги плиз именно парой строчек кода, если не трудно.
Мне нужно много файлов переконвертить, вчера утилы долго искал, ничего не нашел. Некоторые файлы даже Штирлиц не открывает. Пришлось писать скрипт, именно на этом моменте застрял.
WBR, GrAfF.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
из win1251 в utf-8
« Ответ #3 : 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 $_;
}
2B OR NOT 2B = FF

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
из win1251 в utf-8
« Ответ #4 : 09 Апреля 2004, 16:36:31 »
Я не очень хорошо понимаю что значит содрал?
И почему не Convert::Cyrillic?
The documentations is your friend

Оффлайн flymio

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 34
  • +0/-0
  • 0
    • Просмотр профиля
    • http://notlj.ru
из win1251 в utf-8
« Ответ #5 : 09 Апреля 2004, 18:32:42 »
http://mio.itsoft.ru/pub/win2utf8/convert.pm.txt
save target as.
не помню откуда.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
из win1251 в utf-8
« Ответ #6 : 12 Апреля 2004, 01:51:29 »
Chs, man recode у меня нет, ибо ВыньХП. А код правь или нет даже не создаёт 22.txt.

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

flymio, спасибо.

Что нужнос делать с символом, чтобы его потом выловить через регэксп с штукой вроде [\\x98] ?
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
из win1251 в utf-8
« Ответ #7 : 13 Апреля 2004, 15:09:00 »
И всё, никто ничем не поможет?

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

И всё-таки, может кто-нибудь практически знает как вызывать в perl штуки для работы с unicode?
WBR, GrAfF.

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
AS IS...

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
из win1251 в utf-8
« Ответ #9 : 13 Апреля 2004, 15:44:46 »
Будете долго смеяться, говорить: "Я так и знал" и покачивать головой. В общем, perl запускался из папки с урезанный дистрибутивом. Сейчас всё с Encode заработало.
Хотя путь с восьмым битом кажется интереснее. :)
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
из win1251 в utf-8
« Ответ #10 : 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 - какая-то ерунда выходит.
WBR, GrAfF.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
из win1251 в utf-8
« Ответ #11 : 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
The documentations is your friend

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
из win1251 в utf-8
« Ответ #12 : 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
порядок соблюдать
0 OK, 0:1

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
из win1251 в utf-8
« Ответ #13 : 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. "И вообще" я вчера как раз и читал. Похоже, бесполезно. :)
WBR, GrAfF.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
из win1251 в utf-8
« Ответ #14 : 14 Апреля 2004, 18:04:15 »
Цитировать
GrAfF:
ночью читал, не выспался, забыл уже что это такое.

Перечитай, в чем вопрос?
The documentations is your friend

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28