| imho.ws |
![]() |
|
|
|
# 1 |
|
Guest
Сообщения: n/a
|
транситерация в перле
Привет всем!
Люди, помогите решить проблемку. Вот такая задача: нужно заменить (транслитеровать) все символы в в шестнадцетричном формате. из диапазона %C0-%DF в диапазон %E0-%FF. типа $string=~tr/%C0-%DF/%E0-%FF/; но это неработает, как сделать это праильно? И ещё такой вопрос, как мне перевести допустим русскую букву в шестнадцетиричный форма? сделать её типа %ED? Думаю понятно что мне нужно...
|
|
|
# 2 |
|
Добряк Модератор
ГлавБюстАтценка АН ИМХО.ВС Регистрация: 14.10.2002
Адрес: Старый оценщик, НИИ ГлавБюстАтценка АН ИМХО.ВС
Пол: Male
Сообщения: 4 010
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Попробуй так :
$string =~ tr#\xC0-\xDF#\xE0-\xFF#
__________________
Лень - это когда видишь необходимость что-то делать, но не хочется, а влом - это когда что-то хочется, но не видишь необходимости это делать. |
|
|
|
|
# 4 | |
|
Добряк Модератор
ГлавБюстАтценка АН ИМХО.ВС Регистрация: 14.10.2002
Адрес: Старый оценщик, НИИ ГлавБюстАтценка АН ИМХО.ВС
Пол: Male
Сообщения: 4 010
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
nemra
1. А у меня получается : Код:
$string = "\xC0abcd"; $string =~ tr#\xC0-\xDF#\xE0-\xFF#; print "res=$string=\n"; Цитата:
Код:
$hex = '\\x' . sprintf "%1x", ord 'a'; # result is '\x61'
__________________
Лень - это когда видишь необходимость что-то делать, но не хочется, а влом - это когда что-то хочется, но не видишь необходимости это делать. Последний раз редактировалось rontommy; 17.02.2004 в 13:33. |
|
|
|
|
|
# 5 |
|
Guest
Сообщения: n/a
|
да...... то что то сделал получается
![]() вот смотри мне что надо... поможешь? Есть форма на сайте, сервер, на котором находится сайт, не поддерживает "locale", то есть я не могу получить данные из формы на русском языке, перевести их в нижний регистр, отсортировать, и выдать результат в уже нижнем регистре. Вот я и подумал сделать так, получить данные из формы типа -%CA%D3%CA%D3, потом скриптом транситерации перенести всё в нижний регистр. Как будет выглядеть скрипт в этом случае? Подскажешь? или можно как-то подругому решить эту проблему? что посоветуешь? Заранее спасибо!
|
|
|
# 6 |
|
Добряк Модератор
ГлавБюстАтценка АН ИМХО.ВС Регистрация: 14.10.2002
Адрес: Старый оценщик, НИИ ГлавБюстАтценка АН ИМХО.ВС
Пол: Male
Сообщения: 4 010
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
nemra
Подробнее опиши задачу: какой сервер, платформа, какой и куда результат, какая сортировка. Если начал писать - пришли код. P.S. Похожие вещи я делал, использовал функцию CGI::Util::unescape().
__________________
Лень - это когда видишь необходимость что-то делать, но не хочется, а влом - это когда что-то хочется, но не видишь необходимости это делать. |
|
|
|
|
# 7 |
|
Guest
Сообщения: n/a
|
хорошо. попытаюсь описать подробнее
![]() так вот, скажу что надо. Я хостюсь на платном сервере под Линукс, но это не так важно. Я сделал скрипт, проверил его дома под виндос, на сервере апаче, типа: ==================== #!/usr/bin/perl use locale; $string="РусКий ТекСт"; $string=lc($string); print "content-type: text/html\n\n"; print "<html>"; print $string print "<html>"; ==================== Всё нормально заработало, все все русские буквы поменялись в нижний регистр. Потом перенёс его на тот сервер, где находиться сайт, там это не сработало, работает только с латиницей, с русским ноль реакции. Покопался в форумах, полазил в инете, оказалось что на сервере должна быть установлена какая-то локаль и поддержка русского, ну это я не могу сделать... сервер платный, не мой так вот, задача в том, что я пишу чат, на перле, и сейчас делаю регистрацию пользоватлей. На англ. прблем нет, вводится ник, я все ники перевожу в нижний регистр и сравниваю, есть ли такой ник или нет и если нет, то регистрация происходит. С руссим проблема, так как допустим ник "Вася", "вАся", ВАсЯ" и т.д., все они, получается, что разные ники, нужно чтобы это считался как один. Поэтому хочу, чтобы перед регистрацие ник переводился в нижний регистр, и так сохранялся в базе (база простой текстовый файл). Вот проблема в том, что я не могу переносить в нижний регистр.... Я и подумал, что буду получать ник, через html форму, ник на руском получаю в формате типа - %C2%C0%D1%DF. Это слово "ВАСЯ" в вернем регистре, потом надо его перенести в нижний регистр, сравнить с базой, есть ли такой ник или нет (так как в базе будут храниться ники только в нижнем регистре), и зарегестрировать если такого ника нет. А без это получиться что ВАСЯ и вася это разные ники.... мне это не надо... Понимаете в чём дело? ))) Что можно сделать? Как? вот диапазон [А-Я] это [%C0-%DF] а маленьких букв [а-я] это [%E0-%FF]. вот и думал получить строку на русском в формате %C2%C0%D1%DF и заменить все слова с верхнего регистра на буквы в нижнем, и потом делат то что нужно..... Как можно работать с русскими буквами, сортррвать их, менять регистры в этом случае, как решить эту проблему?P.S. никогда не писал так много....
|
|
|
# 8 |
|
Добряк Модератор
ГлавБюстАтценка АН ИМХО.ВС Регистрация: 14.10.2002
Адрес: Старый оценщик, НИИ ГлавБюстАтценка АН ИМХО.ВС
Пол: Male
Сообщения: 4 010
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Да, задачка не простая. Ну вот попробуй, что получилось :
Код:
$input = "VaSiA%C2%C0%D1%DF"; # VaSiAВАСЯ
$s = $input;
$s =~ s/%([0-9a-fA-F]{2})/chr hex($1)/ge; # convert to char
$hex = lc $s; # low case ascii chars
$hex =~ tr#\xC0-\xDF#\xE0-\xFF#; # low case non-ascii chars
$out = $hex;
$out =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg; # URL-encode data
print "input=$input\nhex=$hex\nout=$out\n";
# My output in UNIX :
# input=VaSiA%C2%C0%D1%DF
# hex=vasiaâàñÿ
# out=vasia%E2%E0%F1%FF
__________________
Лень - это когда видишь необходимость что-то делать, но не хочется, а влом - это когда что-то хочется, но не видишь необходимости это делать. |
|
|