用户名包含@的 FTP 站点的有效 URL

问题描述 投票:0回答:2

我想创建一个有效的 URL,以使用以下格式发送到 Windows 文件资源管理器(或 TotalCommander 等其他文件管理器):

ftp://username:[email protected]/folder/

在资源管理器中,它可以使用非常简单的用户名和密码。但当密码包含某些特殊字符时,我收到错误(或者资源管理器仅显示我的文档而不是 FTP 站点)。我使用 URI 编码对密码进行编码,取得了一些成功,但不是 100% 可靠。

有人可以帮我找到有效 FTP URL 的正确要求(包括用户名和密码)吗?谢谢。

以下是使用 AutoHotkey“运行”命令的代码示例(在 Windows 7 64 位环境中):

#NoEnv
#SingleInstance force

strFTPUrl := "ftp://www.jeanlalonde.ca"

strLoginName := "[email protected]"
strPassword := "********"

StringReplace, strFTPUrl, strFTPUrl, % "ftp://", % "ftp://" . strLoginName . ":" . UriEncode(strPassword) . "@"

; Before: ftp://ftp.jeanlalonde.ca
; After: ftp://[email protected]:********@ftp.jeanlalonde.ca
MsgBox, %strFTPUrl%

Run, Explorer "%strFTPUrl%"

return


;------------------------------------------------------------
UriEncode(str)
; from GoogleTranslate by Mikhail Kuropyatnikov
; http://www.autohotkey.net/~sumon/GoogleTranslate.ahk
;------------------------------------------------------------
{ 
   b_Format := A_FormatInteger 
   data := "" 
   SetFormat,Integer,H 
   SizeInBytes := StrPutVar(str,var,"utf-8")
   Loop, %SizeInBytes%
   {
   ch := NumGet(var,A_Index-1,"UChar")
   If (ch=0)
      Break
   if ((ch>0x7f) || (ch<0x30) || (ch=0x3d))
      s .= "%" . ((StrLen(c:=SubStr(ch,3))<2) ? "0" . c : c)
   Else
      s .= Chr(ch)
   }   
   SetFormat,Integer,%b_format% 
   return s 
} 
;------------------------------------------------------------


;------------------------------------------------------------
StrPutVar(string, ByRef var, encoding)
;------------------------------------------------------------
{
    ; Ensure capacity.
    SizeInBytes := VarSetCapacity( var, StrPut(string, encoding)
        ; StrPut returns char count, but VarSetCapacity needs bytes.
        * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
    ; Copy or convert the string.
    StrPut(string, &var, encoding)
   Return SizeInBytes 
}
;------------------------------------------------------------
url ftp autohotkey
2个回答
1
投票

如果用户名(不仅是密码)中也有特殊字符(

@
是一个),您也必须对用户名进行 URL 编码,就像对密码进行 URL 编码一样。

这意味着您必须将

UriEncode
应用于
strLoginName
,就像将其应用于
strPassword
一样。

您需要更新

UriEncode
来对
@
进行编码,因为它没有。

@
的代码是
0x40

if ((ch>0x7f) || (ch<0x30) || (ch=0x3d) || (ch=0x40))

(虽然你也可以从字面上与

@
进行比较:
ch="@"
)。


0
投票

[在此处输入图像描述][1]

[1]:https://i.sstatic.net/9nqeCCDK.png**强文字**

© www.soinside.com 2019 - 2024. All rights reserved.