【发布时间】:2012-04-14 14:58:10
【问题描述】:
当我尝试打开链接中包含双引号 (") 的任何网站时,例如。 user.php?name="stackoverflow" 它只是削减了" 或者有时它会将我重定向到谷歌!?
使用代码:
ShellExecute(0, 'open', PChar('open'), PChar(URL), nil, SW_SHOW) ;
【问题讨论】:
标签: delphi winapi browser delphi-7
当我尝试打开链接中包含双引号 (") 的任何网站时,例如。 user.php?name="stackoverflow" 它只是削减了" 或者有时它会将我重定向到谷歌!?
使用代码:
ShellExecute(0, 'open', PChar('open'), PChar(URL), nil, SW_SHOW) ;
【问题讨论】:
标签: delphi winapi browser delphi-7
您需要使用完全限定的URL,包括http://,并通过将双引号(") 替换为%22 来转义/编码URL。
你也传递了错误的参数。
参见 MSDN:Use ShellExecute to launch the default Web browser
例子:
procedure TForm1.Button1Click(Sender: TObject);
var
URL: string;
begin
URL := 'http://www.user.com/?name="stackoverflow"';
URL := StringReplace(URL, '"', '%22', [rfReplaceAll]);
ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOWNORMAL);
end;
您应该始终对 URL 参数进行编码,而不仅仅是双引号。您可以将 Indy 与 TIdURI.URLEncode - IdURI 单元一起使用。
您还可以使用HTTPApp 单元中的HTTPEncode 对URL 中的每个参数进行编码。
请注意,TIdURI.URLEncode 也会对 ? 和 & 分隔符进行编码。所以我认为最好用HTTPEncode 分别对每个参数进行编码,例如:
URL := 'http://www.user.com/?param1=%s¶m2=%s';
URL := Format(URL, [
HTTPEncode('"stackoverflow.com"'),
HTTPEncode('hello word!')]);
// output: http://www.user.com/?param1=%22stackoverflow.com%22¶m2=hello+word!
【讨论】:
URLEncode(忘记哪个单位,这里没有 D7 可以检查),它可以正确处理所有值而不仅仅是引号(如空格、& 等)。它在 D2007(印地 9)的 IdURI.pas 中。
URLEncode 的评论来编辑答案。我记得有另一个单位可以做到这一点。我正在查看 D7 源文件夹,但找不到它...:/TIdURI.URLEncode 将编码 ? 和 '&` 分隔符。所以我认为用HTTPEncode分别对每个参数进行编码是一个更好的主意。