Вот чистая функция 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 Client Tools или WebConnection), у вас будет эта DLL, если вы не просто удалите этот блок кода. Для более крупных буферов (скажем, кодирующих POST-буферов) подпрограмма кода Fox может работать медленнее, что приводит к отказу от DLL для обеспечения этой функциональности.
Другой вариант, если вы только кодируете URL-адреса (а не POST-буферы HTTP POST-операций), вы можете использовать InternetCanonicalizeUrl API в Windows:
*******************************************
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. Если вы используете переменные формы UrlEncoding HTTP, используйте приведенную выше процедуру.