IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   транситерация в перле (http://www.imho.ws/showthread.php?t=51480)

nemra 17.02.2004 11:10

транситерация в перле
 
Привет всем!
Люди, помогите решить проблемку.
Вот такая задача: нужно заменить (транслитеровать) все символы в в шестнадцетричном формате. из диапазона %C0-%DF в диапазон %E0-%FF.
типа $string=~tr/%C0-%DF/%E0-%FF/; но это неработает, как сделать это праильно? И ещё такой вопрос, как мне перевести допустим русскую букву в шестнадцетиричный форма? сделать её типа %ED?
Думаю понятно что мне нужно... :)

rontommy 17.02.2004 11:31

Попробуй так :
$string =~ tr#\xC0-\xDF#\xE0-\xFF#

nemra 17.02.2004 12:47

нет... не получается так.......

rontommy 17.02.2004 13:30

nemra

1. А у меня получается :
Код:

$string = "\xC0abcd";
$string =~ tr#\xC0-\xDF#\xE0-\xFF#;
print "res=$string=\n";

2.
Цитата:

nemra:
И ещё такой вопрос, как мне перевести допустим русскую букву в шестнадцетиричный форма? сделать её типа %ED?
Код:


$hex = '\\x' . sprintf "%1x", ord 'a'; # result is '\x61'


nemra 17.02.2004 14:35

да...... то что то сделал получается :)
вот смотри мне что надо... поможешь?
Есть форма на сайте, сервер, на котором находится сайт, не поддерживает "locale", то есть я не могу получить данные из формы на русском языке, перевести их в нижний регистр, отсортировать, и выдать результат в уже нижнем регистре. Вот я и подумал сделать так, получить данные из формы типа -%CA%D3%CA%D3, потом скриптом транситерации перенести всё в нижний регистр. Как будет выглядеть скрипт в этом случае? Подскажешь? или можно как-то подругому решить эту проблему? что посоветуешь? Заранее спасибо! :)

rontommy 17.02.2004 15:38

nemra
Подробнее опиши задачу:
какой сервер, платформа, какой и куда результат, какая сортировка.
Если начал писать - пришли код.

P.S. Похожие вещи я делал, использовал функцию CGI::Util::unescape().

nemra 17.02.2004 17:43

хорошо. попытаюсь описать подробнее :)
так вот, скажу что надо. Я хостюсь на платном сервере под Линукс, но это не так важно. Я сделал скрипт, проверил его дома под виндос, на сервере апаче, типа:

====================
#!/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. никогда не писал так много.... :rolleyes:

rontommy 17.02.2004 20:25

Да, задачка не простая. Ну вот попробуй, что получилось :

Код:

$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



Часовой пояс GMT +4, время: 00:09.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.