Как перекодить кириллицу из UTF-8 в обычный транслит? | Крымский форум

Как перекодить кириллицу из UTF-8 в обычный транслит?

  • Добро пожаловать на форум! Рады видеть вас здесь! Зарегистрируйтесь или Войдите в аккаунт, чтобы иметь полный доступ к площадке!
S

SwD

Guest
Сабж, собственно. Под Debian
smile.gif

В однобайтовых локалях типа KOI8-R всё работает на ура:
T_S='echo $O_S | tr абвгдезийклмнопрстуфхы abvgdezijklmnoprstufxy'
T_S='echo $T_S | tr АБВГДЕЗИЙКЛМНОПРСТУФХЫ ABVGDEZIJKLMNOPRSTUFXY'
T_S='echo $T_S | sed "s/[^\'A-Za-z0-9\.,#\$\^\/()_-]/_/g"'

А вот ежели кириллица таки в UTF-8, то tr выдаёт совершеннейшую ахинею... Причем, в принципе, понятно почему. Но не понятно как с этим бороться...
 
T_S='echo $O_S | iconv -f UTF8 -t KOI8R'
 
SlavaD
Мне в транслит надо
smile.gif

Т.е. из строки «текст» надо получить «tekst»
 
T_S='echo $O_S | iconv -f UTF8 -t KOI8R'
T_S='echo $T_S | tr абвгдезийклмнопрстуфхы abvgdezijklmnoprstufxy'
T_S='echo $T_S | tr АБВГДЕЗИЙКЛМНОПРСТУФХЫ ABVGDEZIJKLMNOPRSTUFXY'
T_S='echo $T_S | sed "s/[^\'A-Za-z0-9\.,#\$\^\/()_-]/_/g"'
 
Угу. Но кириллица внутри скрипта в какой кодировке должна быть? Если в системе UTF-8 локаль?

Добавлено в [mergetime]1184697905[/mergetime]
В чем бы она не была в скрипте tr нормально не отработает. Ибо при любом раскладе кириллица будет кодиться двумя байтами
sad.gif
 
Внутри скрипта koi8, первая строка переведет UTF8 в кои8, дальше твои команды перегонят в транслит. Или я где-то не понял задачу ?
 
SlavaD
М-м-м... т.е. весь кириллический текст внутри скрипта ты предлагаешь конвертнуть в KOI8? А как на это всё отреагирует bash, исполняя скрипт, если локаль на Debian'е таки UTF-8? Не получится ли, что кириллица (коды символов явно больше, чем 0x80) эта будет будет востпринята как некие двухбайтовые уникоды?
 
попробовал сделать, понял в чем проблема, правда решение только кривое вижу
sad.gif

Код
#!/bin/sh
test="тест"
test='echo $test | iconv -f UTF8 -t KOI8R'
rus='echo "абвгдезийклмнопрстуфхы" | iconv -f UTF8 -t KOI8R'
test='echo $test | tr $rus abvgdezijklmnoprstufxy'
echo $test



Добавлено в [mergetime]1184745201[/mergetime]
хотя скорее всего правильное решение может появиться только когда tr с utf8 научится работать
 
SlavaD
Понял твою мысль... доберусь до работы проверю. Спасибо

Цитата(SlavaD @ 18 Июля, 2007, 11:51)
когда tr с utf8 научится работать

Да, пока как-то с поддержкой уникода неоднозначная картинка
sad.gif


Добавлено в [mergetime]1184745965[/mergetime]
Кстати... Вот в ветхозаветной версии iconv (95-го года
smile.gif
), которая есть у меня на SCO OpenServer, можно красиво и элегантно создать ручками нужную таблицу перекодировки (в моём случае из кириллицы в транслит)... А можно ли такое сделать для актуальных версий iconv под Linux'ом? Бо man по libiconv как-то обходит этот вопрос...
 
Ну вот, собственно, всё получилось спасибо SlavaD за мысль
smile.gif

Может кому еще пригодится...

Код

C_S='echo абвгдезийклмнопрстуфхыАБВГДЕЗИЙКЛМНОПРСТУФХЫ | iconv -f UTF-8 -t CP1251'
O_S=${O_S//і/i}; O_S=${O_S//І/I}
O_S=${O_S//ї/ji}; O_S=${O_S//Ї/JI}
O_S=${O_S//є/e}; O_S=${O_S//Є/E}
O_S=${O_S//ґ/g}; O_S=${O_S//Ґ/G}
O_S='echo $O_S | iconv -f UTF-8 -t CP1251'
T_S='echo $O_S | tr $C_S abvgdezijklmnoprstufhyABVGDEZIJKLMNOPRSTUFHY'
C_S='echo чЧцЦшШщЩёЁжЖэЭюЮяЯъЪьЬ | iconv -f UTF-8 -t CP1251'
T_S=${T_S//"${C_S:0:1}"/ch}; T_S=${T_S//"${C_S:1:1}"/CH}
T_S=${T_S//"${C_S:2:1}"/ts}; T_S=${T_S//"${C_S:3:1}"/TS}
T_S=${T_S//"${C_S:4:1}"/sh}; T_S=${T_S//"${C_S:5:1}"/SH}
T_S=${T_S//"${C_S:6:1}"/sch}; T_S=${T_S//"${C_S:7:1}"/SCH}
T_S=${T_S//"${C_S:8:1}"/yo}; T_S=${T_S//"${C_S:9:1}"/YO}
T_S=${T_S//"${C_S:10:1}"/zh}; T_S=${T_S//"${C_S:11:1}"/ZH}
T_S=${T_S//"${C_S:12:1}"/e}; T_S=${T_S//"${C_S:13:1}"/E}
T_S=${T_S//"${C_S:14:1}"/yu}; T_S=${T_S//"${C_S:15:1}"/YU}
T_S=${T_S//"${C_S:16:1}"/ya}; T_S=${T_S//"${C_S:17:1}"/YA}
T_S=${T_S//"${C_S:18:1}"/\'}; T_S=${T_S//"${C_S:19:1}"/\'}
T_S=${T_S//"${C_S:20:1}"/\'}; T_S=${T_S//"${C_S:21:1}"/\'}
T_S='echo $T_S | sed "s/[^\'A-Za-z0-9\.,#\$\^\/()_-]/_/g"'
 
Назад
Сверху