1. ;;;函数名称:try-URLencode
  2. ;;;函数说明:url编码
  3. ;;;示    例try-URLencode "http://127.0.0.1/save/1/post上传文件.lsp")
  4. (defun try-URLencode (str / _urlbianma lst utf-8lst)
  5.   (defun _urlbianma(n / 10-16 m n16x x)
  6.     (if (< n 128)
  7.       (chr n);单字节
  8.       (progn
  9.         (setq x "" 10-16 '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F"))
  10.         (while (/= 0 n)
  11.           (setq
  12.             m(rem n 16)
  13.             n(/ n 16)
  14.             n16x(nth m 10-16)
  15.             x(strcat n16x x)
  16.           )
  17.         )
  18.         (if (= x "")(setq x"0"))
  19.         (if (= (strlen x)1) (setq x(strcat "0"x)))
  20.         (strcat "%" x)
  21.       )
  22.       
  23.     )
  24.   )
  25.   (setq utf-8lst(try-str2UTF-8  str))
  26.   (setq lst (mapcar '_urlbianma utf-8lst))
  27.   (apply 'strcat lst)
  28. )
  29. (defun try-str2UTF-8 (str / file_list fileget stream)
  30.   (if (setq stream (vlax-create-object "Adodb.Stream"))
  31.     (progn
  32.       (vlax-put-property stream 'Type 2) ; 1二进制读取 2文本模式读取
  33.       (vlax-put-property stream 'Mode 3) ; 1-读,2-写,3-读写
  34.       (vlax-put-property stream 'Charset "utf-8") ; 设置编码为UTF-8
  35.       (vlax-invoke stream 'Open)
  36.       (vlax-invoke stream 'WriteText str)
  37.       (vlax-put-property stream 'Position 0) ; 将位置重置为起始位置
  38.       (vlax-put-property stream 'Type 1) ; 1二进制读取 2文本模式读取
  39.       (setq FileGet(Vlax-Invoke-Method stream 'Read nil))
  40.       (setq File_list (vlax-safearray->list (vlax-variant-value FileGet)))
  41.       (vlax-release-object stream)
  42.       (cdddr File_list);去除BOM
  43.     )
  44.     (princ"\n无法创建'Adodb.Stream'对象")
  45.   )
  46. )

  47. (try-URLencode "http://127.0.0.1/save/1/post上传文件.lsp")
  48. ;--> "http://127.0.0.1/save/1/post%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6.lsp"


帮一个网友写的URL编码转换,用来带汉字对服务器进行传参
示例:(try-URLencode "http://127.0.0.1/save/1/post上传文件.lsp")
;--> "http://127.0.0.1/save/1/post%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6.lsp"


网友答: 本帖最后由 dcl1214 于 2025-12-25 17:22 编辑

  1. (defun $URLencode$
  2.        (str / $URLencode-sc$ $URLencode-vbs$ STRS $URLencode3$)
  3.   (defun $URLencode3$
  4.    (str / $jz10->jz16$ $str->utf-8$ 16jzs str-new utf-8s)
  5.     (defun $str->UTF-8$  (str / file_list fileget stream)
  6.       (if (and (setq stream (vl-catch-all-apply
  7.             'vlax-create-object
  8.             (list "Adodb.Stream")
  9.           )
  10.          )
  11.          (not (vl-catch-all-error-p stream))
  12.     )
  13.   (progn
  14.     (vlax-put-property stream 'Type 2)
  15.           ; 1二进制读取 2文本模式读取
  16.     (vlax-put-property stream 'Mode 3) ; 1-读,2-写,3-读写
  17.     (vlax-put-property stream 'Charset "utf-8") ; 设置编码为UTF-8
  18.     (vlax-invoke stream 'Open)
  19.     (vlax-invoke stream 'WriteText str)
  20.     (vlax-put-property stream 'Position 0) ; 将位置重置为起始位置
  21.     (vlax-put-property stream 'Type 1)
  22.           ; 1二进制读取 2文本模式读取
  23.     (and (setq FileGet (Vlax-Invoke-Method stream 'Read nil))
  24.          (setq FileGet (vl-catch-all-apply
  25.              'vlax-variant-value
  26.              (list FileGet)
  27.            )
  28.          )
  29.          (setq File_list (vlax-safearray->list FileGet))
  30.          (setq File_list (cdddr File_list)) ;去除BOM
  31.     )
  32.     (vl-catch-all-apply 'vlax-release-object (list stream))
  33.   )
  34.   (print "$URLencode3$无法创建'Adodb.Stream'对象")
  35.       )
  36.       File_list
  37.     )
  38.     (defun $jz10->jz16$  (int)
  39.       (cond ((< int 10)
  40.        (itoa int)
  41.       )
  42.       ((<= 10 int 15)
  43.        (chr (+ int 55))
  44.       )
  45.       (t
  46.        (strcat
  47.          ($jz10->jz16$ (/ int 16))
  48.          ($jz10->jz16$ (rem int 16))
  49.        )
  50.       )
  51.       )
  52.     )
  53.     (setq utf-8s ($str->UTF-8$ str))
  54.     (setq 16jzs  (mapcar  (function (lambda (a) ($jz10->jz16$ a)))
  55.       utf-8s
  56.     )
  57.     )
  58.     (setq
  59.       str-new
  60.        (apply 'strcat
  61.         (mapcar (function (lambda (x) (strcat "%" x))) 16jzs)
  62.        )
  63.     )
  64.     (if  str-new
  65.       (setq str str-new)
  66.     )
  67.     str
  68.   )
  69.   (defun $URLencode-sc$  (str / SC url)
  70.           ;($URLencode$ "213j 213 2 3 %20")
  71.           ;这个方法写出来了,还没应用到具体场景,应该是没问题,20201112
  72.     (if  (or
  73.     (and (setq SC
  74.           (vl-catch-all-apply
  75.       'vlax-get-or-create-object
  76.       (list
  77.         "MSScriptControl.ScriptControl"
  78.       )
  79.           )
  80.          )
  81.          (not (vl-catch-all-error-p SC))
  82.     )
  83.     (and (setq SC
  84.           (vl-catch-all-apply
  85.       'vlax-get-or-create-object
  86.       (list
  87.         "Aec32BitAppServer.AecScriptControl.1"
  88.       )
  89.           )
  90.          )
  91.          (not (vl-catch-all-error-p SC))
  92.     )
  93.     (and (setq SC
  94.           (vl-catch-all-apply
  95.       'vlax-get-or-create-object
  96.       (list
  97.         "ScriptControl"
  98.       )
  99.           )
  100.          )
  101.          (not (vl-catch-all-error-p SC))
  102.     )
  103.     (and (setq SC
  104.           (vl-catch-all-apply
  105.       'vlax-get-or-create-object
  106.       (list
  107.         "{e8540e26-d20e-483f-9fd5-a5a3553a7556}"
  108.       )
  109.           )
  110.          )
  111.          (not (vl-catch-all-error-p SC))
  112.     )
  113.     (and (setq SC
  114.           (vl-catch-all-apply
  115.       'vlax-get-or-create-object
  116.       (list
  117.         "{0e59f1d5-1fbe-11d0-8ff2-00a0d10038bc}"
  118.       )
  119.           )
  120.          )
  121.          (not (vl-catch-all-error-p SC))
  122.     )
  123.   )
  124.       (progn
  125.   (vl-catch-all-apply
  126.     'vlax-put
  127.     (list SC 'Language "JScript")
  128.   )
  129.   (setq url (vl-catch-all-apply
  130.         'vlax-invoke
  131.         (list SC 'run "encodeURI" str)
  132.       )
  133.   )
  134.       )
  135.     )
  136.     (if  sc
  137.       (vlax-release-object sc)
  138.     )
  139.     (IF  (vl-catch-all-error-p url)  ;如果出错
  140.       (setq url nil)
  141.     )
  142.     (if  url
  143.       url
  144.       str
  145.     )
  146.   )
  147.   (defun $URLencode-vbs$
  148.        (str / code *SCR DATA new)
  149.           ;($URLencode$  "http://192.168.0.107:8848/download?filename=中国.png")  
  150.     (if  STR
  151.       (if (or
  152.       *SCR
  153.       (setq
  154.         *SCR (vlax-create-object
  155.          "Aec32BitAppServer.AecScriptControl.1"
  156.        )
  157.       )
  158.       (setq *SCR (vlax-create-object "ScriptControl"))
  159.     )
  160.   (progn
  161.     (vlax-put *SCR 'language "VBScript")
  162.     (setq  code
  163.      "Function UTF8Encode(szString)
  164.         Dim szChar,szTemp,szCode
  165.         Dim szHex,szBin
  166.         Dim iCount1,iCount2
  167.         Dim iStrLen1,iStrLen2
  168.         Dim lResult
  169.         Dim lAscVal
  170.         exclude=\"-_.!~*'();/?&=+$,#\"
  171.         szString = Trim(szString)
  172.         iStrLen1 = Len(szString)
  173.         For iCount1 = 1 To iStrLen1
  174.             szChar = Mid(szString, iCount1, 1)
  175.             lAscVal = AscW(szChar)
  176.             If lAscVal >= &H0 And lAscVal <= &HFF Then
  177.                 If (lAscVal >= &H30 And lAscVal <= &H39) Or (lAscVal >= &H41 And lAscVal <= &H5A) Or (lAscVal >= &H61 And lAscVal <= &H7A) Or InStr(exclude,szChar) >0 Then
  178.                     szCode = szCode & szChar
  179.                 Else
  180.                     szCode = szCode & \"%\" & Hex(AscW(szChar))
  181.                 End If
  182.             Else
  183.                 szHex = Hex(AscW(szChar))
  184.                 iStrLen2 = Len(szHex)
  185.                 For iCount2 = 1 To iStrLen2
  186.                     szChar = Mid(szHex, iCount2, 1)
  187.                     szBin = szBin & Mid(\"0000;0001;0010;0011;0100;0101;0110;0111;1000;1001;1010;1011;1100;1101;1110;1111;\", CLng(\"&H\" & szChar) * 5 + 1, 4)
  188.                 Next
  189.                 szTemp = \"1110\" & Left(szBin, 4) & \"10\" & Mid(szBin, 5, 6) & \"10\" & Right(szBin, 6)
  190.                 For iCount2 = 1 To 24
  191.                     If Mid(szTemp, iCount2, 1) = \"1\" Then
  192.                         lResult = lResult + 1 * 2 ^ (24 - iCount2)
  193.                     Else
  194.                         lResult = lResult + 0 * 2 ^ (24 - iCount2)
  195.                     End If
  196.                 Next
  197.                 szTemp = Hex(lResult)
  198.                 szCode = szCode & \"%\" & Left(szTemp, 2) & \"%\" & Mid(szTemp, 3, 2) & \"%\" & Right(szTemp, 2)
  199.             End If
  200.             szBin = vbNullString
  201.             lResult = 0
  202.         Next
  203.         UTF8Encode = szCode
  204.     End Function"
  205.     )
  206.     (if (and
  207.     (not (vl-catch-all-error-p
  208.            (vl-catch-all-apply
  209.        'vlax-invoke
  210.        (list *SCR
  211.              'addcode
  212.              code
  213.        )
  214.            )
  215.          )
  216.     )
  217.     (not (vl-catch-all-error-p
  218.            (setq new (vl-catch-all-apply
  219.            'vlax-invoke
  220.            (list *SCR
  221.            'run
  222.            "UTF8Encode"
  223.            str
  224.            )
  225.          )
  226.            )
  227.          )
  228.     )
  229.         )
  230.       ()
  231.       (setq new nil)
  232.     )
  233.     (if *SCR
  234.       (vlax-release-object *SCR)
  235.     )
  236.   )
  237.   (progn (print "调用VBScript转码失败,组件未找到"))
  238.       )
  239.     )
  240.     new
  241.   )
  242.   (if (and STR
  243.      (setq strs (vl-string->list str))
  244.      (vl-some (function (lambda (a)
  245.         (> a 128)
  246.             )
  247.         )
  248.         strs
  249.      )
  250.       )
  251.     (or  (setq url ($URLencode3$ str))
  252.   (setq url ($URLencode-sc$ str))
  253.   (setq url ($URLencode-vbs$ str))
  254.   (setq url str)      ;如果上面两个都转码失败了,直接返回原始字串
  255.     )
  256.     (setq url str)
  257.   )
  258.   url
  259. )


收集的


网友答: 不需要那么长的代码,JavaScript搞定
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=193178

网友答: 很有办法 学会了
  • 上一篇:没有了
  • 下一篇:没有了