транслитерация текстового файла

Мысли и размышления о развитии ОС Linux, открытого софта в целом, его общих свойствах, обсуждения всяких околопингвиньих новостей и баек.

Модераторы: Olej, adminn

Правила форума
Все сообщения не по теме форума будут, без каких либо уведомлений, удаляться, а их авторы - убираться из регистрации.
Язык сообщений - исключительно русский.
mmassa24
Интересующийся
Сообщения: 2
Зарегистрирован: 22 фев 2012, 10:35
Контактная информация:

транслитерация текстового файла

Непрочитанное сообщение mmassa24 » 22 фев 2012, 10:45

Не получается справиться с задачей корректной транслитерации текстового файла кириллица-> латиница. Чего тока не пробовал.... Если кто-нибудь знает как сделать - помогите. Готовые скрипты принимаются с большой благодарностью :roll:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение Olej » 23 фев 2012, 11:58

mmassa24 писал(а):Не получается справиться с задачей корректной транслитерации текстового файла кириллица-> латиница. Чего тока не пробовал.... Если кто-нибудь знает как сделать - помогите. Готовые скрипты принимаются с большой благодарностью :roll:
вообще то, здесь информации мало:
1. это Linux, надеюсь ;-)
2. какая кирилица? кирилица кирилице рознь : кодировка ... UTF-8 (не CP1251 надеюсь ;-) )
3. это чисто символьный поток? ("текстовый файл"), не продукт какого-то OpenOfice или AbiWord?

mmassa24
Интересующийся
Сообщения: 2
Зарегистрирован: 22 фев 2012, 10:35
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение mmassa24 » 23 фев 2012, 23:19

кодировка исходного файла может быть любая. Это - линукс

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение Olej » 24 фев 2012, 00:45

mmassa24 писал(а):кодировка исходного файла может быть любая. Это - линукс
что значит "может быть любая" - любая быть не может!
текстовый файл не имеет никакой служебной информации для определения кодировки, а преобразовывать "из чего попало" - это значит преобразовывать мусор.

делаю 2 абсолютно идентичных текстовых файла (как я их сделал - к делу не относится):

Код: Выделить всё

[olej@notebook _TEMP]$ ls -l
итого 8
-rw-rw-r-- 1 olej olej 20 Фев 23 23:39 cp1251.txt
-rw-rw-r-- 1 olej olej 35 Фев 23 23:37 utf-8.txt
они абсолютно идентичны по текстовому содержанию, вот такое:

Код: Выделить всё

[olej@notebook _TEMP]$ cat utf-8.txt
[attachment=1]utf-8.zip[/attachment]
[attachment=0]cp1251.zip[/attachment]
P.S. здесь движок форума идиотски настроен, у администраторов - паранойя, и расширения файлов .txt из числа запрещённых к прикреплению, я вам их переименовал в .zip ... но поверьте ;) - это .txt файлы.
  
это текстовый файл
но они отличаются даже по длине! по числу байт...
а вот их содержимое как дамп:

Код: Выделить всё

[olej@notebook _TEMP]$ hexdump -b cp1251.txt 
0000000 375 362 356 040 362 345 352 361 362 356 342 373 351 040 364 340
0000010 351 353 015 012                                                
0000014
[olej@notebook _TEMP]$ hexdump -b utf-8.txt 
0000000 321 215 321 202 320 276 040 321 202 320 265 320 272 321 201 321
0000010 202 320 276 320 262 321 213 320 271 040 321 204 320 260 320 271
0000020 320 273 012                                                    
0000023
это совершенно разные файлы.
utf-8.zip
(35 байт) 516 скачиваний
cp1251.zip
(20 байт) 523 скачивания
P.S. файлы .txt переименованы в .zip ;) - но это по причине паранойи администраторов форума и запрета на прикрепление файлов .txt, но это они же и есть.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение Olej » 24 фев 2012, 00:56

Olej писал(а):
mmassa24 писал(а):кодировка исходного файла может быть любая. Это - линукс
это совершенно разные файлы.
можно, конечно, глянуть на утилиту file и посмотреть что она делает:

Код: Выделить всё

[olej@notebook _TEMP]$ file utf-8.txt 
utf-8.txt: UTF-8 Unicode text
[olej@notebook _TEMP]$ file cp1251.txt 
cp1251.txt: ISO-8859 text, with CRLF line terminators
- но file - угадывает содержимое-назначение файла по хитрой комбинации маджик-кодов (не только начальных, но и на любых фиксированных позициях).
И она не всегда удачно угадывает! И тогда преобразование пойдёт просто вразнос.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение Olej » 24 фев 2012, 01:03

Olej писал(а): - но file - угадывает содержимое-назначение файла по хитрой комбинации маджик-кодов (не только начальных, но и на любых фиксированных позициях).
И она не всегда удачно угадывает! И тогда преобразование пойдёт просто вразнос.
но даже если вы динамически определитесь с кодировкой файла (по ключу в команде запуска своей программы, или утилитой подобной file), то преобразование в таком варианте будет в десяток раз сложнее и более громоздким:
- из за разницы в длине каждого символа...
- в случае UTF-8 это будет то, что соответствует типу языка С mbchr, и каждый символ может быть от 1 до 4 байт (к счастью для русского языка только до 2-х);
- а в случае CP-1251 или KOI-8r и т.д. - это будет взаимно однозначное соответствие: символ - байт.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение Olej » 24 фев 2012, 01:05

я мог бы попробовать по-быстренькому написать вам конвертор (если получится по-быстренькому), но для этого должна быть корректная формулировка задачи.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение Olej » 24 фев 2012, 03:14

mmassa24 писал(а):кодировка исходного файла может быть любая. Это - линукс
Достаточно приемлемое решение этой задачи показали здесь:
http://forum.ubuntu.ru/index.php?topic= ... msg1368493

Но это только и исключительно для кодировки UTF-8.

Код: Выделить всё

[olej@notebook _TEMP]$ ./translit.py < utf-8.txt 
ehto tekstovyjj fajjl

[olej@notebook _TEMP]$ ./translit.py < cp1251.txt
Traceback (most recent call last):
  File "./translit.py", line 173, in <module>
    out.write( opts.func( b.decode(enc) ).encode(enc) )
  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-5: unsupported Unicode code range

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение bose » 29 фев 2012, 22:58

Olej писал(а):я мог бы попробовать по-быстренькому написать вам конвертор
А iconv чем плох?

Например,

Код: Выделить всё

iconv -f CP1251 -t UTF-8 < file-cp1251 > file-utf8
По iconv -l найдёте список известных кодировок.... там просто море

PS:
Кстати, информация из man 3 iconv:
This function is available in glibc since version 2.1.
CONFORMING TO POSIX.1-2001.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: транслитерация текстового файла

Непрочитанное сообщение Olej » 01 мар 2012, 01:48

bose писал(а):
Olej писал(а):я мог бы попробовать по-быстренькому написать вам конвертор
А iconv чем плох?
это вы говорите о преобразовании кодировок, одну в другую, с сохранением содержания...

речь же исходно шла о транслитерации: преобразовании Б русской в B латинскую и т.д.
то, что называли кодировкой "волапюк".
иногда это бывает нужно, самый частый тому пример: преобразовать имена файлов в каталоге в их латиноязычные эквиваленты.

Ответить

Вернуться в «Общий по Linux и открытому софту»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя