mai62  сделал вариант, которому нужен конвертор 
 добавлениями будет намного сложнее 
 [more=Доработаный вариант (с кодом)]Доработаный вариант:   
 Заменяются всегда: 
 * -> #x 
 : -> #! 
 \ -> #~ 
 | -> #i   
 До первого '?' : 
 / -> \ 
 // -> \#n\  
 ./ -> .#n\ 
 ? -> #\   
 После первого '?' 
 (вариант, когда запросы (query) не делим на цепочку папок): 
 / -> #% 
 // -> #%#% 
 ./ -> .#% 
 ? -> #^   
 Опционально (предложил 
C0USIN): 
 %D0%xx -> символ с кодом xxh (только для кирилицы) 
 %20 -> пробел   
 Если имеем редирект, то FileName:=FileName+'#m' 
 Если последний символ '\' или '.', то FileName:=FileName+'#_'    
Код: unit URLConverter;   
 interface 
 const 
  Normal=0; 
  Redirect=1;   
 function CheckURL(s: string): integer; //недоделано   
 function URL2File(s: string; redir: byte): string; 
 function File2URL(s: string): string; 
 function File2URLtype(s: string): byte;     
 implementation   
 ////////////////////////////////// 
 function URL2File(s: string; redir: byte): string; 
 var 
   i,l:integer; 
   q: boolean; 
 begin 
   q:=false; // индикатор query 
   l:=Length(s);   
   //пожразумеваем что урл правильный, 
   //(правильннй браузер либо проверен CheckURL) 
   // поэтому пропускаю 
http://    for i:=8 to l do 
     case s
 of 
       '*': result:=result+'#x'; 
       ':': result:=result+'#!'; 
       '\': result:=result+'#~'; 
       '|': result:=result+'#i'; 
  
       '/': if q 
              then result:=result+'#%' 
              else 
              begin 
                //имя файла не может быть пустым 
                // и оканчиваться на точку 
                if (s[i-1]='/') or (s[i-1]='.') 
                then result:=result+'#n\' 
                else result:=result+'\'; 
              end; 
  
       '?': if q 
              // если ? уже втречался 
              then result:=result+'#^' 
              else 
              begin 
                q:=true; 
                result:=result+'#\'; 
              end; 
  
     else result:=result+s[i] 
     end; 
  
   //если редирект, добавляе #m 
   if redir=1 
     then result:=result+'#m'; 
  
   //если имя файла пустое, добавляе #_ 
   if result[Length(result)]='\' 
     then result:=result+'#_'; 
  
 end; 
  
 ////////////////////////////////// 
 function File2URL(s: string): string; 
 var 
   i,l :integer; 
   ok{, q} :boolean; 
 begin 
   ok:=true; 
   //q:=false; 
   l:=Length(s); 
  
   //чтобы при работе с кодам не выйти за границы, 
   //сразу это исключим 
   if s[l]='#' then ok:=false; 
  
   //подразумеваю имя файла без пути к папке кеша 
   i:=0; 
   result:='http://'; 
   while ok and (i<l) do 
   begin 
     inc(i); 
  
     if (s[i]='#') 
       then 
       begin 
         inc(i); 
         case s[i] of 
           'x': result:=result+'*'; 
           '!': result:=result+':'; 
           '~': result:=result+'/'; 
           'i': result:=result+'|'; 
  
           '%': result:=result+'/'; 
  
           '\': result:=result+'?'; 
           '^': result:=result+'?'; 
  
           '_', 'n', 'm':result:=result;//ничего не делаем 
 
           else ok:=false //неизвестный код 
         end; 
       end 
       else 
       begin 
         if (s[i]='\') 
           then result:=result+'/' 
           //во всех остальных случаях 
           else result:=result+s[i]; 
       end; 
   end; 
  
   if ok=false 
     then result:='#Error!!!';// 
   //проверял только на неизвестные коды. 
   //если использовать переменную q, то можно 
   //добавить проверку местоположения кодов 
   //или после проверить весь урл сразу CheckURL 
 end; 
  
 ////////////////////////////////// 
 function File2URLtype(s: string): byte; 
 var 
   l:integer; 
 begin 
   l:=Length(s); 
   if (s[l-1]='#') and (s[l]='m') 
     then result:=Redirect 
     else result:=Normal; 
 end;