下面是一个纯FoxPro函数,它可以满足您的需要:
********************************************************
FUNCTION URLEncode
*******************
*** Function: Encodes a string in URL encoded format
*** for use on URL strings or when passing a
*** POST buffer to wwIPStuff::HTTPGetEx
*** Pass: tcValue - String to encode
*** Return: URLEncoded string or ""
********************************************************
LPARAMETER tcValue
LOCAL lcResult, lcChar, lnSize, lnX
*** Large Buffers use the wwIPStuff function
*** for quicker response
if LEN(tcValue) > 512
lnSize=LEN(tcValue)
tcValue=PADR(tcValue,lnSize * 3)
DECLARE INTEGER VFPURLEncode ;
IN WWIPSTUFF ;
STRING @cText,;
INTEGER cInputTextSize
lnSize=VFPUrlEncode(@tcValue,lnSize)
IF lnSize > 0
RETURN SUBSTR(TRIM(tcValue),1,lnSize)
ENDIF
RETURN ""
ENDIF
*** Do it in VFP Code
lcResult=""
FOR lnX=1 to len(tcValue)
lcChar = SUBSTR(tcValue,lnX,1)
DO CASE
CASE ATC(lcChar,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") > 0
lcResult=lcResult + lcChar
CASE lcChar=" "
lcResult = lcResult + "%20"
OTHERWISE
*** Convert others to Hex equivalents
lcResult = lcResult + "%" + RIGHT(transform(ASC(lcChar),"@0"),2)
ENDCASE
ENDFOR && lnX=1 to len(tcValue)
RETURN lcResult
* EOF URLEncode
请注意,它在较大的缓冲区上有wwipstuff.dll的回退—如果您正在使用任何West Wind工具(West Wind客户端工具或WebConnection),您将拥有此dll,如果不只是删除该代码块的话。对于较大的缓冲区(比如编码后缓冲区),Fox代码例程可能会变得很慢,因此需要回退到DLL来提供此功能。
*******************************************
FUNCTION UrlEncode(lcUrl)
*************************
DECLARE INTEGER InternetCanonicalizeUrl IN WinInet.DLL ;
STRING url, STRING @buffer, INTEGER @size, intEGer flags
lnSize = LEN(lcUrl) *3
lcBuffer = REPL(" ",lnSize)
lnSize = LEN(lcBuffer)
lnFlags = 0 &&ICU_ENCODE_PERCENT
if( InternetCanonicalizeUrl(lcUrl,@lcBuffer,@lnSize, lnFlags) == 0)
RETURN ""
ENDIF
IF lnSize > 0
RETURN LEFT(lcBuffer,lnSize)
ENDIF
RETURN ""
这段代码很快,但它的字符编码非常宽松。基本上它不编码任何扩展字符,这可能对你来说很重要,也可能不重要。如果您真的只对URL进行编码,请使用此选项。如果要对HTTP表单变量进行UrlEncoding,请使用上面的例程。