在Delphi中将URL转换为有效的win32文件名

Ali*_*ter 2 delphi url filenames encode

作为Delphi应用程序的一部分,我想将URL转换为文件名.我正在做的是缓存QR码.QR码代表一个URL,我想用一个代表该URL的文件名存储QR码图像.例如http://myurl.com/bla可能会成为http ___ myrul.com_bla.png - 这里我刚刚用下划线替换了任何非字母数字字符(并添加了.png扩展名).

我想知道是否有一种简单/标准的方法(最好是在Delphi中)或者我应该编写上面提到的算法.

RRU*_*RUZ 7

尝试编码URL(返回的字符串将始终是有效的文件名),然后添加扩展.该过程也是可逆的,因此您可以从文件名中获取原始URL.

{$APPTYPE CONSOLE}

uses
  SysUtils;

function URLEncode(const AUrl: string): string;
var
  Index: Integer;
begin
  Result := '';
  for Index := 1 to Length(AUrl) do
  begin
    case AUrl[Index] of
      'A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.': Result := Result + AUrl[Index];
      ' '                                        : Result := Result + '%20';
    else
        Result := Result + '%' + IntToHex(Ord(AUrl[Index]), 2);
    end;
  end;
end;

function UrlToFileName(const AUrl,Ext : string) : TFileName;
begin
   Result := Format('%s.%s',[URLEncode(AUrl),Ext]);
end;

begin
  try
    Writeln(UrlToFileName('http://stackoverflow.com/questions/5784218/convert-a-url-to-a-valid-win32-filename-in-delphi','png'));
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

这将回来

http%3A%2F%2Fstackoverflow.com%2Fquestions%2F5784218%2Fconvert-a-url-to-a-valid-
win32-filename-in-delphi.png
Run Code Online (Sandbox Code Playgroud)

有关其他信息,请阅读Naming Files, Paths, and Namespaces文章.