This Might Be Useful

URLEncode и URLDecode в Delphi

При написании программ, взаимодействующих по сети, иногда встает проблема передачи, приема и распознавания символов локального алфавита. Например, при написании клиента для некоего сайта. Мы, собственно, наталкиваемся на отсутствие в Delphi функций URLEncode и URLDecode. Поэтому приходится их писать самим. Ниже приведены упомянутые функции. Чтобы лишний раз не изобретать велосипед.

DELPHI:
  1. function DigitToHex(Digit: Integer): Char;
  2. begin
  3.   case Digit of
  4.     0..9: Result := Chr(Digit + Ord('0'));
  5.     10..15: Result := Chr(Digit - 10 + Ord('A'));
  6.   else
  7.     Result := '0';
  8.   end;
  9. end; // DigitToHex
  10.  
  11. function URLEncode(const S: string): string;
  12.   var
  13.     i, idx, len: Integer;
  14. begin
  15.   len := 0;
  16.   for i := 1 to Length(S) do
  17.     if ((S[i] >= '0') and (S[i] <= '9')) or
  18.     ((S[i] >= 'A') and (S[i] <= 'Z')) or
  19.     ((S[i] >= 'a') and (S[i] <= 'z')) or (S[i] = ' ') or
  20.     (S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then
  21.       len := len + 1
  22.     else
  23.       len := len + 3;
  24.   SetLength(Result, len);
  25.   idx := 1;
  26.   for i := 1 to Length(S) do
  27.     if S[i] = ' ' then
  28.     begin
  29.       Result[idx] := '+';
  30.       idx := idx + 1;
  31.     end
  32.     else if ((S[i] >= '0') and (S[i] <= '9')) or
  33.     ((S[i] >= 'A') and (S[i] <= 'Z')) or
  34.     ((S[i] >= 'a') and (S[i] <= 'z')) or
  35.     (S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then
  36.     begin
  37.       Result[idx] := S[i];
  38.       idx := idx + 1;
  39.     end
  40.     else
  41.     begin
  42.       Result[idx] := '%';
  43.       Result[idx + 1] := DigitToHex(Ord(S[i]) div 16);
  44.       Result[idx + 2] := DigitToHex(Ord(S[i]) mod 16);
  45.       idx := idx + 3;
  46.     end;
  47. end; // URLEncode
  48.  
  49. function URLDecode(const S: string): string;
  50.   var
  51.     i, idx, len, n_coded: Integer;
  52.   function WebHexToInt(HexChar: Char): Integer;
  53.   begin
  54.     if HexChar < '0' then
  55.       Result := Ord(HexChar) + 256 - Ord('0')
  56.     else if HexChar <= Chr(Ord('A') - 1) then
  57.       Result := Ord(HexChar) - Ord('0')
  58.     else if HexChar <= Chr(Ord('a') - 1) then
  59.       Result := Ord(HexChar) - Ord('A') + 10
  60.     else
  61.       Result := Ord(HexChar) - Ord('a') + 10;
  62.   end;
  63. begin
  64.   len := 0;
  65.   n_coded := 0;
  66.   for i := 1 to Length(S) do
  67.     if n_coded >= 1 then
  68.     begin
  69.       n_coded := n_coded + 1;
  70.       if n_coded >= 3 then
  71.         n_coded := 0;
  72.     end
  73.     else
  74.     begin
  75.       len := len + 1;
  76.       if S[i] = '%' then
  77.         n_coded := 1;
  78.     end;
  79.   SetLength(Result, len);
  80.   idx := 0;
  81.   n_coded := 0;
  82.   for i := 1 to Length(S) do
  83.     if n_coded >= 1 then
  84.     begin
  85.       n_coded := n_coded + 1;
  86.       if n_coded >= 3 then
  87.       begin
  88.         Result[idx] := Chr((WebHexToInt(S[i - 1]) * 16 +
  89.           WebHexToInt(S[i])) mod 256);
  90.         n_coded := 0;
  91.       end;
  92.     end
  93.     else
  94.     begin
  95.       idx := idx + 1;
  96.       if S[i] = '%' then
  97.         n_coded := 1;
  98.       if S[i] = '+' then
  99.         Result[idx] := ' '
  100.       else
  101.         Result[idx] := S[i];
  102.     end;
  103. end; // URLDecode

· Запуск приложения и ожидание его завершения
· Установка иконки приложения в system tray
· О сайте TMBU.info

- Коментировать
- Trackback

4 Responses to “URLEncode и URLDecode в Delphi”


  1. dimzon541 Says:

    Вполне даже аккуратненько
    Особенно порадовало что размер строки вычисляешь СНАЧАЛА
    С другой стророны два раза ходить по массиву...
    А не пробовал выделить строку с запасом (например при кодировании - утроить исходную длину) а потом уменьшить размер через SetLength?

    И ещё одно замечание - в случае, например, русского алфавита этот код будет работать только если кодировки на сервере и клиенте совпадают. Не забываем что вообще-то на сервере может быть настройка Response/Request encoding = unicode

  2. Filosoff Says:

    я сильно не люблю SetLength. потому и не использую :)
    а про unicode - собственно, я везде и всегда использую только unicode. забыл написать.

  3. kerya Says:

    в модуле idGlobal есть готовые URLEncode/URLDecode

  4. Filosoff Says:

    kerya @ 12.08.2007, 20:48 #

    в модуле idGlobal есть готовые URLEncode/URLDecode

    хм. что-то не вижу. и ои не документированы, если и есть.

Leave a Reply

code