Страница 1 из 1

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

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

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

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

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

Добавлено: 23 фев 2012, 23:19
mmassa24
кодировка исходного файла может быть любая. Это - линукс

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

Добавлено: 24 фев 2012, 00:45
Olej
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 байт) 519 скачиваний
cp1251.zip
(20 байт) 525 скачиваний
P.S. файлы .txt переименованы в .zip ;) - но это по причине паранойи администраторов форума и запрета на прикрепление файлов .txt, но это они же и есть.

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

Добавлено: 24 фев 2012, 00:56
Olej
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 - угадывает содержимое-назначение файла по хитрой комбинации маджик-кодов (не только начальных, но и на любых фиксированных позициях).
И она не всегда удачно угадывает! И тогда преобразование пойдёт просто вразнос.

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

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

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

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

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

Добавлено: 24 фев 2012, 03:14
Olej
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

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

Добавлено: 29 фев 2012, 22:58
bose
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.

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

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

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