Крымский форум (Crimea-Board) Поиск Участники Помощь Текстовая версия Crimea-Board.Net
Здравствуйте Гость .:: Вход :: Регистрация ::. .:: Выслать повторно письмо для активации  
 
> Рекламный блок.
 
 
 
 
 
> Ваша реклама, здесь
 
 
 

  Start new topic Start Poll 

> Как перекодить кириллицу из UTF-8 в обычный транслит?
SwD | Профиль
Дата 17 Июля, 2007, 22:18
Quote Post



Посторонний
Group Icon

Группа: VIP
Сообщений: 3750
Регистрация: 26.08.03
Авторитет: 12
Вне форума

Предупреждения:
(0%) -----


Сабж, собственно. Под 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 выдаёт совершеннейшую ахинею... Причем, в принципе, понятно почему. Но не понятно — как с этим бороться...


____________________
Вот и всё, что было, не было и нету.
Правильно и ясно, здорово и вечно...
PM
1/10182   
Бобер | Бездомный
Реклама двигатель прогресса       
Quote Post



А кому сча лехко?
Group Icon


















_________________
Желающим разместить рекламу смотреть сюдой
/   
SlavaD | Профиль
Дата 17 Июля, 2007, 22:26
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 14
Вне форума



T_S='echo $O_S | iconv -f UTF8 -t KOI8R'
PMEmail Poster
1/7177   
SwD | Профиль
Дата 17 Июля, 2007, 22:36
Quote Post



Посторонний
Group Icon

Группа: VIP
Сообщений: 3750
Регистрация: 26.08.03
Авторитет: 12
Вне форума

Предупреждения:
(0%) -----


SlavaD
Мне в транслит надо smile.gif
Т.е. из строки «текст» надо получить «tekst»


____________________
Вот и всё, что было, не было и нету.
Правильно и ясно, здорово и вечно...
PM
1/10182   
SlavaD | Профиль
Дата 17 Июля, 2007, 22:36
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 14
Вне форума



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"'
PMEmail Poster
1/7177   
SwD | Профиль
Дата 17 Июля, 2007, 22:39
Quote Post



Посторонний
Group Icon

Группа: VIP
Сообщений: 3750
Регистрация: 26.08.03
Авторитет: 12
Вне форума

Предупреждения:
(0%) -----


Угу. Но — кириллица внутри скрипта в какой кодировке должна быть? Если в системе UTF-8 локаль?

Добавлено в 22:45
В чем бы она не была в скрипте — tr нормально не отработает. Ибо при любом раскладе кириллица будет кодиться двумя байтами sad.gif


____________________
Вот и всё, что было, не было и нету.
Правильно и ясно, здорово и вечно...
PM
1/10182   
SlavaD | Профиль
Дата 17 Июля, 2007, 23:19
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 14
Вне форума



Внутри скрипта koi8, первая строка переведет UTF8 в кои8, дальше твои команды перегонят в транслит. Или я где-то не понял задачу ?
PMEmail Poster
2/7177   
SwD | Профиль
Дата 18 Июля, 2007, 11:08
Quote Post



Посторонний
Group Icon

Группа: VIP
Сообщений: 3750
Регистрация: 26.08.03
Авторитет: 12
Вне форума

Предупреждения:
(0%) -----


SlavaD
М-м-м... т.е. весь кириллический текст внутри скрипта ты предлагаешь конвертнуть в KOI8? А как на это всё отреагирует bash, исполняя скрипт, если локаль на Debian'е таки UTF-8? Не получится ли, что кириллица (коды символов явно больше, чем 0x80) эта будет будет востпринята как некие двухбайтовые уникоды?


____________________
Вот и всё, что было, не было и нету.
Правильно и ясно, здорово и вечно...
PM
1/10182   
SlavaD | Профиль
Дата 18 Июля, 2007, 11:51
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 14
Вне форума



попробовал сделать, понял в чем проблема, правда решение только кривое вижу 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



Добавлено в 11:53
хотя скорее всего правильное решение может появиться только когда tr с utf8 научится работать
PMEmail Poster
1/7177   
SwD | Профиль
Дата 18 Июля, 2007, 12:00
Quote Post



Посторонний
Group Icon

Группа: VIP
Сообщений: 3750
Регистрация: 26.08.03
Авторитет: 12
Вне форума

Предупреждения:
(0%) -----


SlavaD
Понял твою мысль... доберусь до работы — проверю. Спасибо

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

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

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


____________________
Вот и всё, что было, не было и нету.
Правильно и ясно, здорово и вечно...
PM
2/10182   
SwD | Профиль
Дата 18 Июля, 2007, 22:13
Quote Post



Посторонний
Group Icon

Группа: VIP
Сообщений: 3750
Регистрация: 26.08.03
Авторитет: 12
Вне форума

Предупреждения:
(0%) -----


Ну вот, собственно, всё получилось — спасибо 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"'



____________________
Вот и всё, что было, не было и нету.
Правильно и ясно, здорово и вечно...
PM
1/10182   

Topic Options Start new topic Start Poll 

 



[ Script Execution time: 0.0861 ]   [ 12 queries used ]   [ GZIP включён ]


Создание и продвижение сайтов в Крыму



Top