在默认浏览器中打开网页,在网址内加双引号(")

Hij*_*asa 6 browser delphi winapi delphi-7

当我尝试在链接中打开任何具有双引号(")的站点时,例如.user.php?name="stackoverflow"它只是削减"或有时它重定向到谷歌!?二手代码:

ShellExecute(0, 'open', PChar('open'), PChar(URL), nil, SW_SHOW) ;
Run Code Online (Sandbox Code Playgroud)

kob*_*bik 13

你需要使用一个完全限定的URL包括http://和转义/编码,方法URL是用双引号(")代替%22.

你也传递了错误的参数.

请参阅MSDN:使用ShellExecute启动默认Web浏览器

例:

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;
Run Code Online (Sandbox Code Playgroud)

您应始终对URL参数进行编码,而不仅仅是双引号.你可以使用Indy with TIdURI.URLEncode- IdURIunit.
你也可以使用HTTPEncodeHTTPApp单元在每个参数编码URL.

请注意,它还将对分隔符TIdURI.URLEncode进行编码.所以我认为分别编码每个参数是个更好的主意,例如:?&HTTPEncode

URL := 'http://www.user.com/?param1=%s&param2=%s';
URL := Format(URL, [
  HTTPEncode('"stackoverflow.com"'),
  HTTPEncode('hello word!')]);
// output: http://www.user.com/?param1=%22stackoverflow.com%22&param2=hello+word!
Run Code Online (Sandbox Code Playgroud)

  • +1,但是使用Indy的`URLEncode`(忘记哪个单位,这里没有D7来检查)要好得多,这将正确处理所有值,而不仅仅是引号(如空格,`&`等等) ).它位于D2007(Indy 9)的IdURI.pas中. (2认同)
  • @KenWhite,BTW`TIdURI.URLEncode`也将编码`?`和'&`分隔符.所以我认为用`HTTPEncode`分别编码每个参数是个更好的主意. (2认同)