URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 82951
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Перекодирование русских символов ви..."

Отправлено auto_tips , 12-Фев-12 21:47 
Данная задача появилась когда потребовалось перенести адресную книгу с одного телефона в другой. Использовался 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"`
   done

   CMD=`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


Содержание

Сообщения в этом обсуждении
"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 12-Фев-12 21:47 
Сильно. Но я для этих же целей использовал машину с виндовс и программы от производителей.
PROFIT

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Crazy Alex , 12-Фев-12 23:17 
Понимаете, у приличного пользователя (Power User который), не говоря о программисте/сисадмине вышеописанные манипуляции замут меньше времени, чем установка "программ от производителей".

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено JL2001 , 13-Фев-12 04:19 
...и установка виндовс чтоб установить программы грёбанного производителя который выпускает их только под троян-ось

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено ABATAPA , 13-Фев-12 08:09 
Что только не сделают люди, не желающие или не умеющие искать существующие ответы и решения...

$ 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:Вася


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 13-Фев-12 10:15 
> Что только не сделают люди, не желающие или не умеющие искать существующие
> ответы и решения...

Что только не делают люди, вместо простого универсального скрипта качающие, компилирующие и инсталлирующие какую-то левую софтину. Стандартным для подобных целей пока остаётся iconv, но он QUOTED-PRINTABLE и транслит не поддерживает.

> $ echo 'N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=B0=D1=81=D1=8F' | recode -f /QP..utf8

И где здесь преобразование в транслит ???


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Cuernud , 13-Фев-12 10:39 
> Что только не делают люди, вместо простого универсального скрипта качающие, компилирующие
> и инсталлирующие какую-то левую софтину.

А что, есть дистрибутивы, в репах которых нет recode?

> И где здесь преобразование в транслит ???

Так и не понял - ЗАЧЕМ? Чем UTF-8 не устраивает?


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 13-Фев-12 11:58 
Не обращай внимания, каждому хочется изобрести свои велосипед и запилить статью про него на хабр^W opennet.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Kroz , 13-Фев-12 15:05 
> Так и не понял - ЗАЧЕМ? Чем UTF-8 не устраивает?

Тем что в таком виде не заливался на телефон. Не пропускал русские буквы.
Если расскажите как залить русскую адресную книгу на телефон Fly - буду очень признателен.


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 13-Фев-12 16:21 
Этот ваш fly - совершенно левая китайчатина сляпаная на коленке. Простите уж за честность.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Cuernud , 15-Фев-12 09:50 
> Если расскажите как залить русскую адресную книгу на телефон Fly - буду
> очень признателен.

Кроме "выкиньте этот телефон" ничего в голову не приходит, как ни странно.


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 15-Фев-12 22:46 
Да... теперь я буду хотя-бы знать что этот fly не просто Г а совсем Г. Спасибо что предупредили.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено trdm , 20-Фев-12 19:09 
У меня знакомые в рем-центре.
Их высказывание о Fly более чем нелестные.
чаще других ломаются.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено NavDotRu , 24-Фев-12 23:55 
Кстати не лишним было бы добавить - это не очень сложно

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Kroz , 13-Фев-12 15:08 
> Что только не сделают люди, не желающие или не умеющие искать существующие
> ответы и решения...

Про утилиту recode не знал, спасибо.
И, да, нужен именно транслит. Наверное еще тулза какая-то есть. Если подскажите - будет потомкам в этом разделе.
И, да, задача несложная, мне проще и быстрее скрипт написать чем гуглить и что-то ставить.


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено gegMOPO4 , 13-Фев-12 17:36 
Да, есть. recode.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 13-Фев-12 12:15 
не нужно придумывать кодировщики, чтобы потом раскодировщики изобретать

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 13-Фев-12 16:19 
Эпический набор костылей и велосипедов. Да еще транслит? На нем уже даже старые бабки с кирпичами вместо телефона смски так стесняются писать. Потому что даже полные кирпичи уже давно умеют нормально работать с русским.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено dima , 13-Фев-12 16:53 
пишу только на транслите.
так как размер СМС в 2 раза большем чем на руси.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Александр , 13-Фев-12 17:09 
попробуйте звонить, за минуту можно сказать больше чем написать

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 13-Фев-12 23:35 
> попробуйте звонить, за минуту можно сказать больше чем написать

Такие обычно звонят, и пытаются или выпалить все в бесплатные 3 секунды, или просто сбрасывают звонок дабы им перезвонили за свой счет. Я не перезваниваю - кому надо, тот и платит. Культурные люди так себя не ведут и заботятся о удобстве собеседника.


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Cuernud , 15-Фев-12 09:52 
> Культурные люди так себя не ведут и заботятся о удобстве собеседника.

Именно. И не пишут транслитом. Сообщения, написанные транслитом (будь то SMS или e-mail), удаляю не глядя.


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноон , 28-Фев-12 09:58 
Транслит на ощупь определяете?

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено А , 22-Мрт-12 12:43 
Такое впечатление, что попал в 2001 год. Fly, "позвонил и сбросил"...

"syncml"
Отправлено mee too , 13-Фев-12 21:37 
Йода мастер syncml падавану юному использовать советует.

"syncml"
Отправлено Аноним , 14-Фев-12 11:15 
а если его нет в телефоне?

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено cvsup , 15-Фев-12 16:30 
> 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


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено konst , 21-Фев-12 15:32 
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;'

(для транслит)


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 21-Фев-12 21:15 
> (для транслит)

Это совсем не транслит, даже в вашем примере вместо 'ya' выводит 'q'. Не говоря о таких буквах, как ж, ш, щ, ю, ч, ц.


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено konst , 22-Фев-12 01:13 
>> (для транслит)
> Это совсем не транслит, даже в вашем примере вместо 'ya' выводит 'q'.
> Не говоря о таких буквах, как ж, ш, щ, ю, ч,
> ц.

1. все-таки транслит
2. самый четкий транслит. См.
echo "Вася Пупкин" |iconv -t KOI-7 | iconv -f KOI-7 -t KOI8-R (или UTF8)
3. Самый удобный трвнслит, если к нему привыкнуть, e.g. что  я=q...
:)


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 22-Фев-12 13:38 
> 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[


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 17-Фев-12 16:23 
Лучше если б сделали доработку модуля Template::Plugin::Translit::RU и закоммитить все это дело обратно.

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено trdm , 20-Фев-12 19:12 
Решал подобную задачу недавно:
http://trdm.byethost31.com/topic.php?id=42&page=1

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено pavlinux , 22-Фев-12 02:44 
Митрофаныч, а ну-ка покажи народу sed-дзен-буддизм! :)

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Andrey Mitrofanov , 22-Фев-12 10:47 
Уймись уже, фанклуб ходячий... И без меня всё обсудили. Рассказать что ли, как .ppd-шку из cp1251 в utf8 примерно таким же костылём перегнать? Так, никакого ж профита. B)

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Аноним , 29-Фев-12 22:53 
Хорошая учебная статья

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Oinari , 03-Мрт-12 13:49 
http://www.artlebedev.ru/tools/decoder/

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено wanderer , 29-Ноя-13 12:16 
Смотри Декодер от студии А. Лебедева http://www.artlebedev.ru/tools/decoder/advanced/

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено михаил , 06-Окт-16 18:14 
!/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"`
   done

   CMD=`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);'


"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Винг , 09-Окт-23 19:05 
echo "=D0=92=D0=B0=D1=81=D1=8F" | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\\*STDIN, \\*STDOUT);'

"Перекодирование русских символов вида =D0=9B в транслит"
Отправлено Cvetochek , 23-Мрт-25 08:38 
Прочитала статью ,и удивилась как прекрасен Мир.Когда я объясняю свой предмет, слушатели  говорят,что это очень сложно.Но вот язык программирования-это действительно сложно.Примерно -поняла о чем разговор,но как применить эти формулы(можно списать),но как запомнить???Программисты-респект!Приятно было почитать ваш спор о раскодировании Васи Пупкина )))А да ,мой предмет сольфеджио,теория музыки!Куда проще :каденции ,модуляции,транспонирование и много интересного.