2

我无法快速找到谷歌答案,而且我面前没有帮助(长篇故事),所以,我的问题是:有没有一种简单的方法可以在 MS Visual FoxPro 8 中对字符串进行 URL 编码

4

3 回答 3

3

看看这里:http ://fox.wikis.com/wc.dll?Wiki~GoogleTranslater urlEncode 函数可能是您正在寻找的。

于 2010-06-17T17:03:02.910 回答
3

这是一个纯 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。对于较大的缓冲区(例如编码 POST 缓冲区),Fox 代码例程可能会变慢,因此回退到 DLL 以提供此功能。

如果您只对 URL 进行编码(而不是 POST 缓冲 HTTP POST 操作),则另一个选项可以在 Windows 中使用 InternetCanonicalizeUrl API:

*******************************************
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 表单变量,请使用上面的例程。

于 2015-04-09T04:47:46.230 回答
1

另外,请查看http://www.west-wind.com/presentations/shellapi/shellapi.asp 清单 #3 与我使用的非常接近。

于 2011-03-04T08:11:27.330 回答