KawaiDesu
@KawaiDesu

Urlencode в bash?

Пишу скрипт на bash-е. Необходимо конвертировать строку в вид urlencoded как это делает, к примеру, urlencode() в PHP.
Использование иных скриптовых языков (python, php, etc) не вариант. Необходимо простое и сравнительно быстрое (по скорости выполнения) решение. Также, желательно чтобы утилиту, выполняющую операцию, можно было поставить в большинстве популярных *nix систем, т.е. необходима хотя бы минимальная переносимость.
Например, есть утилита ascii2uni/uni2ascii, но она не кодирует обычные (английские) буквенные символы; мне же нужен результат как при полноценном urlencode (для application/x-www-form-urlencoded).
Варианты?
  • Вопрос задан
  • 5991 просмотр
Решения вопроса 1
bmkobzar
@bmkobzar
#!/bin/bash
phpurlencode() {
  local hexchars="0123456789ABCDEF"
  local string="${1}"
  local strlen=${#string}
  local encoded=""

  for (( pos=0 ; pos<strlen ; pos++ )); do
        c=${string:$pos:1}
        if [ "$c" == ' ' ];then
                encoded+='+'
        elif ( [[ "$c" != '!' ]] && [ "$c" \< "0" ] && [[ "$c" != "-" ]] && [[ "$c" != "." ]] ) || ( [ "$c" \< 'A' ] && [ "$c" \> '9' ]  ) || ( [ "$c" \> 'Z' ] && [ "$c" \< 'a' ] && [[ "$c" != '_' ]]  ) || ( [ "$c" \> 'z' ] );then
                hc=`printf '%X' "'$c"`
                dc=`printf '%d' "'$c"`
                encoded+='%'
                f=$(( $dc >> 4 ))
                s=$(( $dc & 15 ))
                encoded+=${hexchars:$f:1}
                encoded+=${hexchars:$s:1}
        else
                encoded+=$c
        fi
  done
  echo "${encoded}"    # You can either set a return variable (FASTER) 
  REPLY="${encoded}"   #+or echo the result (EASIER)... or both... :p
}

echo $1 
echo http://url/q?=$( phpurlencode "$1" )

Обработку русских букв можеш сам придумать,
тут реализация php
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Opaspap
@Opaspap
на perl используя search.cpan.org/~mithun/URI-Encode-0.09/lib/URI/En...

#!/usr/bin/perl
use URI::Encode qw(uri_encode uri_decode);
my $arg=shift,$decode=shift;
if ($decode) {
        print uri_decode($arg);
} else {
        utf8::decode($arg);
        print uri_encode($arg);
}
print "\n";


первый агумент - строка, второй - если есть, то строку декодировать, если нет - кодировать.

модуль URI::Encode написан на perl, маленький, его можно установить из репозитария вашего дистра, используя cpan или скопипастить из исходника. perl есть практически в каждой системе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы