在Delphi中,URLEncode文件名的最佳方法是什么?

4
我的桌面应用程序需要从互联网下载文件。文件路径已知,但文件名本身是半变量的,即其他人将在那里放置新文件,我的应用程序将不得不下载这些文件。
现在我想确保URL安全,并且它将被正确解释。此外,如果文件名中有“#”(你永远不知道),我希望它被编码。Javascript有两个不同的函数来实现这一点:encodeURIencodeURIComponent。后者还对'#'字符进行编码,以及其他一些字符。
当然,我可以自己编写代码,但我认为肯定有现成的函数可用,我也可以避免犯一些错误。
我将使用一个对象来下载文件,该对象使用WinInet系列API函数(InternetOpen及其类似函数)。
我开始在MSDN上搜寻,果然找到了UrlCanonicalize。但是还有UrlEscapeCreateUri(但这个在Delphi 2010单元中不存在),最后还有InternetCreateUrl,需要我将整个URL分割开来。我更愿意将URL的第一部分与URLEncoded文件名连接起来。
此外,它们都有大量不同的标志,不同的默认值随着Windows版本的变化而改变,我再也无法弄清楚它们之间的区别了。有人知道哪一个最适合这个目的吗?

名称应该是%十六进制编码。但我不知道哪个函数可以做到这一点。 - Deanna
我在问题中提到的所有函数在某个时候都会这样做。但我不太清楚哪些字符将使用哪些标志进行编码,以及是否所有Unicode字符都会被正确编码。 - Martijn
注意。仅仅因为你收到了一个正确编码的文件名并不意味着它是你应该“使用”的文件名。如果你收到带有路径组件的文件名,特别是相对路径组件,比如..,你可能会无意中覆盖你没有预期的文件。 - Rob Kennedy
@RobKennedy:没错。但我已经对它进行了清理,以保证文件名不包含任何无效字符或路径分隔符,毕竟这些文件不能被放置在(Windows)服务器上。 - Martijn
接收方如何知道Windows服务器正在发送可信数据?它如何知道它正在与其认为的服务器通信?确保在接收时检查路径,而不仅仅是在发送时。 - Rob Kennedy
显示剩余2条评论
2个回答

9
尝试使用TIdURI.PathEncode函数(位于idURI单元中),它是与Delphi捆绑在一起的Indy库的一部分。
{$APPTYPE CONSOLE}

{$R *.res}

uses
  idURI,
  SysUtils;

Var
  FileName : string;
  Encoded  : string;
begin
  try
   FileName:='File with a Very weird f***name*#%*#%<>[]';
   Encoded:=TIdURI.PathEncode(FileName);
   Writeln(Encoded);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

这将返回

File%20with%20a%20Very%20weird%20f%2A%2A%2Aname%2A%23%25%2A%23%25%3C%3E%5B%5D

此外,您还可以查看TIdURI.URLDecodeTIdURI.URLEncode函数。


更好的是:PathEncode和ParamsEncode分别编码它们特定的字符集,这也编码了UTF8String字符。谢谢,这就是我要找的! - Martijn
非常感谢!这正是我在寻找的 XD。 - KryNaC

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接