Данная задача появилась когда потребовалось перенести адресную книгу с одного телефона в другой. Использовался wammu. Принцип был таков: подключив первый телефон экспортировать адерсную книгу в .vcf файл, потом подключить второй телефон и импортировать в него .vcf файл. Проблема в том, что русские имена контактов не хотели импортироваться. Было принято решение перекодировать их в транслит.В .vcf файле имя на русском было записано вот в такой форме:
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=B0=D1=81=D1=8F
Очевидно, что это юникод, оформленный в формате Quoted-Printable.
Для перевода нужно составить таблицу соответствия таких вот комбинаций транслитерированым символам - в этом, пожалуй, основная сложность задачи.Внизу скрипт, который выведет команду, которой можно перекодировать файлы. Мягкий и твердый знаки игнорируются.
#!/bin/sh
src=(\
=D0=90 =D0=91 =D0=92 =D0=93 =D0=94 =D0=95 =D0=96 =D0=97 =D0=98 =D0=99 =D0=9A =D0=9B =D0=9C =D0=9D =D0=9E =D0=9F =D0=A0 =D0=A1 =D0=A2 =D0=A3 =D0=A4 =D0=A5 =D0=A6 =D0=A7 =D0=A8 =D0=A9 =D0=AA =D0=AB =D0=AC =D0=AD =D0=AE =D0=AF =D0=B0 =D0=B1 =D0=B2 =D0=B3 =D0=B4 =D0=B5 =D0=B6 =D0=B7 =D0=B8 =D0=B9 =D0=BA =D0=BB =D0=BC =D0=BD =D0=BE =D0=BF =D1=80 =D1=81 =D1=82 =D1=83 =D1=84 =D1=85 =D1=86 =D1=87 =D1=88 =D1=89 =D1=8A =D1=8B =D1=8C =D1=8D =D1=8E =D1=8F)
res=(\
A B V G D Ye Zh Z I Y K L M N O P R S T U F H Ts Ch Sh Sch Ь Y Ь E Yu Ya a b v g d ye zh z i y k l m n o p r s t u f h ts ch sh sch Ь y Ь e yu ya)CMD=""
for ((A=0;A<64;A++)) ; do
CMD=`echo "$CMD | sed -e s/${src[$A]}/${res[$A]}/g"`
doneCMD=`echo "cat file.vcf $CMD | sed -e s/Ь//g | sed -e s/N\;CHARSET=UTF-8\;ENCODING=QUOTED-PRINTABLE/N/g | less"`
echo "$CMD"
Для раскодирования quoted-printable блоков можно использовать простой perl-скрипт:echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\*STDIN, \*STDOUT);'
URL:
Обсуждается: http://www.opennet.dev/tips/info/2665.shtml
Сильно. Но я для этих же целей использовал машину с виндовс и программы от производителей.
PROFIT
Понимаете, у приличного пользователя (Power User который), не говоря о программисте/сисадмине вышеописанные манипуляции замут меньше времени, чем установка "программ от производителей".
...и установка виндовс чтоб установить программы грёбанного производителя который выпускает их только под троян-ось
Что только не сделают люди, не желающие или не умеющие искать существующие ответы и решения...$ echo 'N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=B0=D1=81=D1=8F' | recode -f /QP..utf8
N;CHARSETUTF-8;ENCODINGQUOTED-PRINTABLE:Вася
> Что только не сделают люди, не желающие или не умеющие искать существующие
> ответы и решения...Что только не делают люди, вместо простого универсального скрипта качающие, компилирующие и инсталлирующие какую-то левую софтину. Стандартным для подобных целей пока остаётся iconv, но он QUOTED-PRINTABLE и транслит не поддерживает.
> $ echo 'N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=B0=D1=81=D1=8F' | recode -f /QP..utf8
И где здесь преобразование в транслит ???
> Что только не делают люди, вместо простого универсального скрипта качающие, компилирующие
> и инсталлирующие какую-то левую софтину.А что, есть дистрибутивы, в репах которых нет recode?
> И где здесь преобразование в транслит ???
Так и не понял - ЗАЧЕМ? Чем UTF-8 не устраивает?
Не обращай внимания, каждому хочется изобрести свои велосипед и запилить статью про него на хабр^W opennet.
> Так и не понял - ЗАЧЕМ? Чем UTF-8 не устраивает?Тем что в таком виде не заливался на телефон. Не пропускал русские буквы.
Если расскажите как залить русскую адресную книгу на телефон Fly - буду очень признателен.
Этот ваш fly - совершенно левая китайчатина сляпаная на коленке. Простите уж за честность.
> Если расскажите как залить русскую адресную книгу на телефон Fly - буду
> очень признателен.Кроме "выкиньте этот телефон" ничего в голову не приходит, как ни странно.
Да... теперь я буду хотя-бы знать что этот fly не просто Г а совсем Г. Спасибо что предупредили.
У меня знакомые в рем-центре.
Их высказывание о Fly более чем нелестные.
чаще других ломаются.
Кстати не лишним было бы добавить - это не очень сложно
> Что только не сделают люди, не желающие или не умеющие искать существующие
> ответы и решения...Про утилиту recode не знал, спасибо.
И, да, нужен именно транслит. Наверное еще тулза какая-то есть. Если подскажите - будет потомкам в этом разделе.
И, да, задача несложная, мне проще и быстрее скрипт написать чем гуглить и что-то ставить.
Да, есть. recode.
не нужно придумывать кодировщики, чтобы потом раскодировщики изобретать
Эпический набор костылей и велосипедов. Да еще транслит? На нем уже даже старые бабки с кирпичами вместо телефона смски так стесняются писать. Потому что даже полные кирпичи уже давно умеют нормально работать с русским.
пишу только на транслите.
так как размер СМС в 2 раза большем чем на руси.
попробуйте звонить, за минуту можно сказать больше чем написать
> попробуйте звонить, за минуту можно сказать больше чем написатьТакие обычно звонят, и пытаются или выпалить все в бесплатные 3 секунды, или просто сбрасывают звонок дабы им перезвонили за свой счет. Я не перезваниваю - кому надо, тот и платит. Культурные люди так себя не ведут и заботятся о удобстве собеседника.
> Культурные люди так себя не ведут и заботятся о удобстве собеседника.Именно. И не пишут транслитом. Сообщения, написанные транслитом (будь то SMS или e-mail), удаляю не глядя.
Транслит на ощупь определяете?
Такое впечатление, что попал в 2001 год. Fly, "позвонил и сбросил"...
Йода мастер syncml падавану юному использовать советует.
а если его нет в телефоне?
> echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\*STDIN, \*STDOUT);'echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\*STDIN, \*STDOUT);' | iconv -f utf-8
echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\*STDIN, \*STDOUT);' | iconv -f utf-8 -t KOI-7 | perl -ne 'tr/[A-Z][a-z]/[a-z][A-Z]/;print;'(для транслит)
> (для транслит)Это совсем не транслит, даже в вашем примере вместо 'ya' выводит 'q'. Не говоря о таких буквах, как ж, ш, щ, ю, ч, ц.
>> (для транслит)
> Это совсем не транслит, даже в вашем примере вместо 'ya' выводит 'q'.
> Не говоря о таких буквах, как ж, ш, щ, ю, ч,
> ц.1. все-таки транслит
2. самый четкий транслит. См.
echo "Вася Пупкин" |iconv -t KOI-7 | iconv -f KOI-7 -t KOI8-R (или UTF8)
3. Самый удобный трвнслит, если к нему привыкнуть, e.g. что я=q...
:)
> 2. самый четкий транслит. См.
> echo "Вася Пупкин" |iconv -t KOI-7 | iconv -f KOI-7 -t KOI8-RА теперь попробуйте добавить символы латиницы в строку "Вася Пупкин".
> (или UTF8)
> 3. Самый удобный трвнслит, если к нему привыкнуть, e.g. что я=q...Превыкайте :-)
$ echo "ж, ш, щ, ю, ч" |iconv -t KOI-7
V, [, ], @, ^$ echo "чуш" |iconv -t KOI-7
^U[
Лучше если б сделали доработку модуля Template::Plugin::Translit::RU и закоммитить все это дело обратно.
Решал подобную задачу недавно:
http://trdm.byethost31.com/topic.php?id=42&page=1
Митрофаныч, а ну-ка покажи народу sed-дзен-буддизм! :)
Уймись уже, фанклуб ходячий... И без меня всё обсудили. Рассказать что ли, как .ppd-шку из cp1251 в utf8 примерно таким же костылём перегнать? Так, никакого ж профита. B)
Хорошая учебная статья
http://www.artlebedev.ru/tools/decoder/
Смотри Декодер от студии А. Лебедева http://www.artlebedev.ru/tools/decoder/advanced/
!/bin/shsrc=(\\
=D0=90 =D0=91 =D0=92 =D0=93 =D0=94 =D0=95 =D0=96 =D0=97 =D0=98 =D0=99 =D0=9A =D0=9B =D0=9C =D0=9D =D0=9E =D0=9F =D0=A0 =D0=A1 =D0=A2 =D0=A3 =D0=A4 =D0=A5 =D0=A6 =D0=A7 =D0=A8 =D0=A9 =D0=AA =D0=AB =D0=AC =D0=AD =D0=AE =D0=AF =D0=B0 =D0=B1 =D0=B2 =D0=B3 =D0=B4 =D0=B5 =D0=B6 =D0=B7 =D0=B8 =D0=B9 =D0=BA =D0=BB =D0=BC =D0=BD =D0=BE =D0=BF =D1=80 =D1=81 =D1=82 =D1=83 =D1=84 =D1=85 =D1=86 =D1=87 =D1=88 =D1=89 =D1=8A =D1=8B =D1=8C =D1=8D =D1=8E =D1=8F)
res=(\\
A B V G D Ye Zh Z I Y K L M N O P R S T U F H Ts Ch Sh Sch Ь Y Ь E Yu Ya a b v g d ye zh z i y k l m n o p r s t u f h ts ch sh sch Ь y Ь e yu ya)CMD=""
for ((A=0;A<64;A++)) ; do
CMD=`echo "$CMD | sed -e s/${src[$A]}/${res[$A]}/g"`
doneCMD=`echo "cat file.vcf $CMD | sed -e s/Ь//g | sed -e s/N\\;CHARSET=UTF-8\\;ENCODING=QUOTED-PRINTABLE/N/g | less"`
echo "$CMD"
Для раскодирования quoted-printable блоков можно использовать простой perl-скрипт:echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\\*STDIN, \\*STDOUT);'
echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\\*STDIN, \\*STDOUT);'
Прочитала статью ,и удивилась как прекрасен Мир.Когда я объясняю свой предмет, слушатели говорят,что это очень сложно.Но вот язык программирования-это действительно сложно.Примерно -поняла о чем разговор,но как применить эти формулы(можно списать),но как запомнить???Программисты-респект!Приятно было почитать ваш спор о раскодировании Васи Пупкина )))А да ,мой предмет сольфеджио,теория музыки!Куда проще :каденции ,модуляции,транспонирование и много интересного.