Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-03-03 Пенетрантность Dmitry A. Fedorov
On Tue, 2 Mar 2004, Pavel Kulkov wrote:

 Вот хороший вещь.

Ну вот уж нет. Наглотался в свое время перекодировщиков с вшитыми
таблицами да еще и кривыми.

Таблицы должны быть: 1. внешними;
2. тщательно выверенными;
2.1 с unicode.org

Все, что не соответствует - кривые поделки.
Мне их не надо, я и сам такие делал.

-- 
Если виртуальная память закончилась, она ненастоящая.



Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-03-03 Пенетрантность Yury A. Yurevich
разработчики debian рекомендуют konwert :))) Потому как при установке
woody и выборе в tasksel Cyrillic и Russian ставится konwert :)

P.S. Одна из его фич, которая мне нравится, напр символ номер в koi8r
переделывает в No

-- 
Best regards, 
Yury A. Yurevich
Registered Linux User #276311
Debian 3.0r1 Woody kernel 2.6.2



Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-03-02 Пенетрантность Zhenja Kaluta

 DAF == Dmitry A. Fedorov writes:

В общем задача - есть текст в cp1251, надо его перегонять
скриптами в koi8r.  iconv(1) даже с ключем -c вываливается в
середине со словами iconv: illegal input sequence at position
1385
   
   У меня успешно работает recode CP1251/..KOI8-R/ Но предупреждений
   о потере данных это не отменяет.
  
 DAF  А мне хватило одного раза, когда текст успешно преобразовался
 DAF  из КОИ-8 в 1251, а вот обратно на том же тексте выдавался
 DAF  illegal... и продолжать отказывался. Ну и как это назвать?

recode -f и гори он ...
  
-- 
Zhenja KalutaICQ 74596027
GnuPG FingerPrint: B86C B548 7CC4 B58F 0CA3  856E 7EE8 52DE E6B7 8725


Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-03-02 Пенетрантность Pavel Kulkov
On Tue, Mar 02, 2004 at 06:31:37PM +0200, Zhenja Kaluta wrote:
 
  DAF == Dmitry A. Fedorov writes:
 
 В общем задача - есть текст в cp1251, надо его перегонять
 скриптами в koi8r.  iconv(1) даже с ключем -c вываливается в
 середине со словами iconv: illegal input sequence at position
 1385

У меня успешно работает recode CP1251/..KOI8-R/ Но предупреждений
о потере данных это не отменяет.
   
  DAF  А мне хватило одного раза, когда текст успешно преобразовался
  DAF  из КОИ-8 в 1251, а вот обратно на том же тексте выдавался
  DAF  illegal... и продолжать отказывался. Ну и как это назвать?
 
 recode -f и гори он ...
   
 -- 
 Zhenja KalutaICQ 74596027
 GnuPG FingerPrint: B86C B548 7CC4 B58F 0CA3  856E 7EE8 52DE E6B7 8725
 ЪТХPт■ ▒ Ъzf╒√зy╦ ÷ЗН╡х ÷Зч╙Г╛╥Ыb╡шЪuФБjХ╝
 ╤╛╧╦чrзЧИЛ╧╩╝чЪТК╒ФЕ{П╗·ж°╤X╛╤f╛╣ЙЪ√+-ЁВ^n╖Ч┼Ю

Вот хороший вещь.
#!/usr/bin/perl

##
# Copyright (C) 1998 Stefan Mashkevich [EMAIL PROTECTED]
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License.
# Disclaimer: The program is provided as is and there is no
# warranty of any kind whatsoever. Your using it is at your own risk.
##
# Transliterating from KOI8, DOS866, WIN1251, ISO8859-5, MAC
# into any of these or into Latin characters
# Manually: between two given encodings
# Automatically: into a given encoding, figuring out the initial one
# automatically by frequency analysis
#
# v0.1 S.Mashkevich  16 Nov 1998
#  first working version
# v0.5 S.Mashkevich  26 Nov 1998
#  redesigned and shortened main code
#  completely rewrote frequency analysis algorithm
#  added MAC, ISO, Ukrainian and Belorussian characters
# v0.8 S.Mashkevich  13 Dec 1998
#  added reverse transliteration (handled by separate script;
#  this script was not changed)
#
# text on standard input, recoded on standard output
# see usage message
#
##
# encodings:
# KOI8  DOS866(=ALT)  WIN1251  MAC  ISO8859-5  Latin(=translit)

@intos = qw/k a w m i l/;

$ncods = @intos - 1;  #  last = Latin, treated separately
##
# read in character codes

while (DATA) {
/^\d/  do {
@data = split;
for $j (0..$ncods-1) {
$chars{$intos[$j]} = join '', $chars{$intos[$j]}, chr($data[$j]);
$latin{chr($data[$0])} = $data[$ncods];
}
}
}

##
# determine what to do

@args = split //, $ARGV[0]; 

# into what
$into = pop @args || usage();
# If Latin, will recode into 0 and raise flag to re-recode later on
$into eq $intos[$ncods]  do {$into = $intos[0]; $latflag = 1};
$chars_into = $chars{$into} || usage();

# from what (or automatic)
defined ($from = pop @args) ?
($chars_from = $chars{$from} || usage()) :
($automatic = 1) ;

# there shouldn't be anything else in the argument
defined (pop @args)  usage();

##
# actual recoding

undef $/;
$_ = STDIN;

# analyze if necessary
defined ($automatic)  do {
$result = analyze;
do {print; exit} unless ($result);   # probably non-Russian text
$chars_from = $chars{$result};
};

# transliterate
eval tr/$chars_from/$chars_into/, 1 || die $@;

# if it was Latin
defined ($latflag)  do {
foreach $char (keys %latin) {
s/$char/$latin{$char}/g;
};
};

# output
print;

##
sub analyze {

# Frequency analyzer of Russian texts
# attempting to determine which encoding they are in
# Returns 0 if $_ appears to be non-Russian text
# or one of k,a,w,m,i as it deems $_ is in
# Things really depend on specific features of the encodings here,
# therefore I don't care to avoid hardwired magic constants

# first, count how many (perhaps) Russian characters are there
my $intrst_chars = join '', map(chr, 128..255);
my $length = eval tr /$intrst_chars/$intrst_chars/;

# threshold for deciding when there are too few frequent characters in it
my $thrhold = 0.08;

# letters we will use: a,e,i,o,A,E,I,O
my %aeio, %num_aeio, $enc_aieo, %AEIO, %num_AEIO, $enc_AIEO, $enc;
my $num_aeio_max = 0, $num_AIEO_max = 0;
$aeio{k} = join '', map(chr, qw/193 197 201 207/);
$aeio{a} = join '', map(chr, qw/160 165 168 174/);
$aeio{w} = join '', map(chr, qw/224 229 232 238/);
$aeio{i} = join '', map(chr, qw/208 213 216 222/);
$AEIO{k} = join '', map(chr, qw/225 229 233 239/);
$AEIO{a} = join '', map(chr, qw/128 133 136 142/);
$AEIO{w} = join '', map(chr, qw/192 197 200 206/);
$AEIO{i} = join '', map(chr, qw/176 181 184 190/);

# Count how many times there are a, e, i, o
for $enc (qw/k a w i/) {
  

Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-03-02 Пенетрантность Sergey V. Belik
Попробуй 
apt-get install re

Sergey Belik


replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность Vlad Harchev
Hi,

В общем задача - есть текст в cp1251, надо его перегонять скриптами в koi8r.
iconv(1) даже с ключем -c вываливается в середине со словами
iconv: illegal input sequence at position 1385

Есть ли какие-либо утилиты которые могут такие ситуации обрабатывать - в смысле
не отваливаться?
Помню в altlinux iconv(1) (то есть часть glibc) специально патчится чтобы
это можно было обрабатывать, но их патч почему-то в официальном glibc (2.2.5)
отсутствует..

Даже подойдет кривая поделка (которых кажется море), заточенная только на 
русские кодировки - не одного имени такой поделки ни я, ни гугль вспомнить
не можем..
-- 
 Best regards,
  -Vlad



Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность eric
Привет! Знакома эта проблема!
 В общем задача - есть текст в cp1251, надо его перегонять скриптами в
 koi8r. iconv(1) даже с ключем -c вываливается в середине со словами
 iconv: illegal input sequence at position 1385
Не понимает некоторых букв русского алфавита (точно не помню каких, но что-то 
вроде [яюъь])

 Есть ли какие-либо утилиты которые могут такие ситуации обрабатывать - в
 смысле не отваливаться?
Есть. Давно и успешно пользуюсь konwert
konwert cp1251-koi8r Имя_файла # Ещё ни разу не подводила


Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность Victor B. Wagner
On 2004.02.28 at 12:17:50 +0400, Vlad Harchev wrote:

 Hi,
 
 В общем задача - есть текст в cp1251, надо его перегонять скриптами в koi8r.
 iconv(1) даже с ключем -c вываливается в середине со словами
 iconv: illegal input sequence at position 1385

Первое о чём бы я подумал - поменять технологию, и не использовать
koi8-r. Ведь iconv не просто так ругается. Он предупреждает что
информация будет теряться.

В koi8-r есть далеко не все символы, которые пользователи кодировки 1251
используют в обычных текстовых файлах. Кавычек нет, длинного тире нет и
так далее.

Если заменить koi8-r на  1251 или utf-8 не удаётся - подумать о том,
на что заменять эти символы. И уже в соответствии с этим искать решение.

В принципе, утилита которая используя iconv(3) перекодирует всё, что
перекодируется, а остальное заменяет по таблице, пишется на коленке за
два часа.

Аналогичная фунциональность у меня предусмотрена в catdoc, который,
правда, не пользуется iconv даже на тех платформах, где iconv
работоспособен. (сatdoc умеет перекодировать и текстовые файлы, не
только вордовые)

Кроме того, можно использовать в качетсве перекодировочной engine
любой продвинутый скриптовый язык - Tcl (=8.1), Perl (=5.8) или Python
(=2.0).

Tcl по умолчанию заменяет неизвестные символы на  вопросительный знак,
что не всегда удобно. Точно так же, кстати, поступает Oracle, если
кодировка клиента не совпадает с кодировкой сервера.

Кстати, да, если тексты потом предполагается складывать в БД, то лучше
всего поручить перекодировку самой БД. Они это умеют.




 Есть ли какие-либо утилиты которые могут такие ситуации обрабатывать - в 
 смысле
 не отваливаться?
 Помню в altlinux iconv(1) (то есть часть glibc) специально патчится чтобы
 это можно было обрабатывать, но их патч почему-то в официальном glibc (2.2.5)
 отсутствует..

В 2.3 есть. 




Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность Vlad Harchev
On Sat, Feb 28, 2004 at 11:48:20AM +0300, Victor B. Wagner wrote:
 On 2004.02.28 at 12:17:50 +0400, Vlad Harchev wrote:
 
  Hi,
  
  В общем задача - есть текст в cp1251, надо его перегонять скриптами в koi8r.
  iconv(1) даже с ключем -c вываливается в середине со словами
  iconv: illegal input sequence at position 1385
 
 Первое о чём бы я подумал - поменять технологию, и не использовать
 koi8-r. Ведь iconv не просто так ругается. Он предупреждает что
 информация будет теряться.
 
 В koi8-r есть далеко не все символы, которые пользователи кодировки 1251
 используют в обычных текстовых файлах. Кавычек нет, длинного тире нет и
 так далее.
 
 Если заменить koi8-r на  1251 или utf-8 не удаётся - подумать о том,
 на что заменять эти символы. И уже в соответствии с этим искать решение.

Все это справедливо.
Но у меня в реальности была необходимость переименовать дерево файлов
с русскими именами в cp1251 в дерево файлов с именами koi8-r.

Имена в koi8r практически всем устраивают, в революциях смысла для меня лично
нет.

 В принципе, утилита которая используя iconv(3) перекодирует всё, что
 перекодируется, а остальное заменяет по таблице, пишется на коленке за
 два часа.

 Это да, но зачем эти 2 часа терять если есть готовые решения.
 
 
  Есть ли какие-либо утилиты которые могут такие ситуации обрабатывать - в 
  смысле
  не отваливаться?
  Помню в altlinux iconv(1) (то есть часть glibc) специально патчится чтобы
  это можно было обрабатывать, но их патч почему-то в официальном glibc 
  (2.2.5)
  отсутствует..
 
 В 2.3 есть. 

 Вроде их патч не до конца интегрировали - у них кажется была возможность
замены неконвертируемых символов на указанный.

-- 
 Best regards,
  -Vlad



Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность Alexey
On Sat, 28 Feb 2004 12:17:50 +0400
Vlad Harchev [EMAIL PROTECTED] wrote:

 Hi,
 
 В общем задача - есть текст в cp1251, надо его перегонять скриптами в
 koi8r. iconv(1) даже с ключем -c вываливается в середине со словами
 iconv: illegal input sequence at position 1385
 
 Есть ли какие-либо утилиты которые могут такие ситуации обрабатывать -
 в смысле не отваливаться?
 Помню в altlinux iconv(1) (то есть часть glibc) специально патчится
 чтобы это можно было обрабатывать, но их патч почему-то в официальном
 glibc (2.2.5) отсутствует..
 
 Даже подойдет кривая поделка (которых кажется море), заточенная только
 на русские кодировки - не одного имени такой поделки ни я, ни гугль
 вспомнить не можем..

#apt-cache show re
Package: re
Priority: optional
Section: text
Installed-Size: 97
Maintainer: Aigars Mahinovs [EMAIL PROTECTED]
Architecture: i386
Version: 0.1-5
Depends: libc6 (= 2.3.1-1), libgcc1 (= 1:3.2.1-1), libstdc++5 (=
1:3.2.1-1) Filename: pool/main/r/re/re_0.1-5_i386.deb
Size: 2
MD5sum: 5c0a17838c50bd57c9488be1d4ab433e
Description: Russian Anywhere -- Russian text converter
 Russian Anywhere is a Russian character decoding program. It allows to
 transfer Russian characters between different codepages. It's main
 purpose is to convert damaged Russian e-mail messages to readable form
and it also may be used to convert files from/to known and unknown
codepages. Task: russian



-- 
Guten Tag, Alexey



Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность Mikhail Gusarov
Vlad Harchev [EMAIL PROTECTED] writes:

 В общем задача - есть текст в cp1251, надо его перегонять скриптами в koi8r.
 iconv(1) даже с ключем -c вываливается в середине со словами
 iconv: illegal input sequence at position 1385

У меня успешно работает recode CP1251/..KOI8-R/
Но предупреждений о потере данных это не отменяет.

-- 
Sincerely yours, Mikhail A Gusarov
Software Engineer
IBM Solutions Group, Axmor Software
ICQ# 111575219



Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность Dmitry A. Fedorov
On Sat, 28 Feb 2004, Mikhail Gusarov wrote:

  В общем задача - есть текст в cp1251, надо его перегонять скриптами в koi8r.
  iconv(1) даже с ключем -c вываливается в середине со словами
  iconv: illegal input sequence at position 1385
 
 У меня успешно работает recode CP1251/..KOI8-R/
 Но предупреждений о потере данных это не отменяет.

А мне хватило одного раза, когда текст успешно преобразовался из КОИ-8 в
1251, а вот обратно на том же тексте выдавался illegal... и продолжать
отказывался. Ну и как это назвать?



Re: replacement for iconv(1) that handles unconvertable chars correctly

2004-02-28 Пенетрантность Maxim Tyurin
On Sat, Feb 28, 2004 at 01:28:57PM +0400, Vlad Harchev wrote:
 On Sat, Feb 28, 2004 at 11:48:20AM +0300, Victor B. Wagner wrote:
  On 2004.02.28 at 12:17:50 +0400, Vlad Harchev wrote:
  
   Hi,
   
   В общем задача - есть текст в cp1251, надо его перегонять скриптами в 
   koi8r.
   iconv(1) даже с ключем -c вываливается в середине со словами
   iconv: illegal input sequence at position 1385
  
  Первое о чём бы я подумал - поменять технологию, и не использовать
  koi8-r. Ведь iconv не просто так ругается. Он предупреждает что
  информация будет теряться.
  
  В koi8-r есть далеко не все символы, которые пользователи кодировки 1251
  используют в обычных текстовых файлах. Кавычек нет, длинного тире нет и
  так далее.
  
  Если заменить koi8-r на  1251 или utf-8 не удаётся - подумать о том,
  на что заменять эти символы. И уже в соответствии с этим искать решение.
 
 Все это справедливо.
 Но у меня в реальности была необходимость переименовать дерево файлов
 с русскими именами в cp1251 в дерево файлов с именами koi8-r.
 
 Имена в koi8r практически всем устраивают, в революциях смысла для меня лично
 нет.
 
  В принципе, утилита которая используя iconv(3) перекодирует всё, что
  перекодируется, а остальное заменяет по таблице, пишется на коленке за
  два часа.
 
  Это да, но зачем эти 2 часа терять если есть готовые решения.

Когда мне такое понадобилось я писал на коленке.
Затем чтоб оно еще и лапки меняло на , знак номера на # (или No) по
желанию и длинное тире на минус.

  
  
   Есть ли какие-либо утилиты которые могут такие ситуации обрабатывать - в 
   смысле
   не отваливаться?
   Помню в altlinux iconv(1) (то есть часть glibc) специально патчится чтобы
   это можно было обрабатывать, но их патч почему-то в официальном glibc 
   (2.2.5)
   отсутствует..
  
  В 2.3 есть. 
 
  Вроде их патч не до конца интегрировали - у них кажется была возможность
 замены неконвертируемых символов на указанный.
 

-- 

With Best Regards, Maxim Tyurin
JID:[EMAIL PROTECTED]


pgpr3ji8F6558.pgp
Description: PGP signature