【问题标题】:Opening webpage in default browser with double-quotes (") inside url在默认浏览器中打开网页,网址中带有双引号 (")
【发布时间】: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


    【解决方案1】:

    您需要使用完全限定的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 单元中的HTTPEncodeURL 中的每个参数进行编码。

    请注意,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!
    

    【讨论】:

    • +1,但最好使用 Indy 的 URLEncode(忘记哪个单位,这里没有 D7 可以检查),它可以正确处理所有值而不仅仅是引号(如空格、& 等)。它在 D2007(印地 9)的 IdURI.pas 中。
    • 谢谢肯,我只是用关于 Indy URLEncode 的评论来编辑答案。我记得有另一个单位可以做到这一点。我正在查看 D7 源文件夹,但找不到它...:/
    • @KenWhite, BTW TIdURI.URLEncode 将编码 ? 和 '&` 分隔符。所以我认为用HTTPEncode分别对每个参数进行编码是一个更好的主意。
    • 可能是;我已经有一段时间没有使用它了(目前没有做任何需要它的事情 - 主要是 SFTP/PGP 的东西,其实不需要)。不过,我认为它可能仍然可以正确解决;不过现在不能测试它(现在也不需要知道,)。
    • 请注意,在 Delphi 10.2 (Tokyo) 下,这不会执行任何操作。但是,如果在调试器之外执行,代码将起作用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多