Forum Webscript.Ru

Программирование => Perl => Тема начата: Atreides от 27 Марта 2005, 20:16:40

Название: regesp русские буквы в 16-ричный код
Отправлено: Atreides от 27 Марта 2005, 20:16:40
Подскажите, как заменить в строке все русские буквы на их шестнадцатеричные коды вида %xx  то есть чтобы строка "абв" выглядела как "%E0%E1%E2". Заранее спасибо, кого не заломает ответить 8)
Название: regesp русские буквы в 16-ричный код
Отправлено: Atreides от 27 Марта 2005, 20:19:28
Фу ты, даже "regexp" не могу нормально написать...
Название: regesp русские буквы в 16-ричный код
Отправлено: ondr от 27 Марта 2005, 20:32:24
попробуй написать сам, я помогу

да, и поясни, пожалуйста, какие критерии русских букв?
Название: regesp русские буквы в 16-ричный код
Отправлено: Atreides от 27 Марта 2005, 20:45:48
Русские буквы выхватываю так: $string =~ s/[\\xE0-\\xFF]?/.../g; вопрос - что написать в замену?
Название: regesp русские буквы в 16-ричный код
Отправлено: ondr от 27 Марта 2005, 21:10:53
ага, хорошо

вариант 1

$string =~ s/([\\xE0-\\xFF])/sprintf( "%%%02X", $1 )/eg;


вариант2 (более быстрый)

# предварительно создадим массив следующего содержания
for( 0 .. 255 ) {
  $chr2hex{ chr() } = sprintf( "%%%02X", $_ );
}
# и упрощаем рег. выражение
$string =~ s/([\\xE0-\\xFF])/$chr2hex{$1}/g;
Название: regesp русские буквы в 16-ричный код
Отправлено: Atreides от 27 Марта 2005, 21:51:22
ок, написал.

#!/usr/bin/perl
$string = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
$string =~ s/([\\xE0-\\xFF])/sprintf( "%%%02X", $1 )/eg;
print $string;

результат:
%00%00%00%00%00%00ё%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00

где я торможу?
Название: regesp русские буквы в 16-ричный код
Отправлено: Atreides от 27 Марта 2005, 22:53:33
Фух, домучал наконец. Вот это вроде работает:
$string =~ s/([\\xA8,\\xB8,\\xC0-\\xFF])/sprintf("%%%02X", ord($1))/eg;
Название: regesp русские буквы в 16-ричный код
Отправлено: ondr от 27 Марта 2005, 23:42:47
да, прошу прощения, ord забыл : )