明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: tryhi

[函数] URL编码转换URLencode

[复制链接]
 楼主| 发表于 昨天 15:19 | 显示全部楼层
jun353835273 发表于 2025-12-26 11:04
"%u+4f60%u+597d%u+4e16%u+754c"
_$ B
"%u+4f60%u+597d%u+4e16%u+754c"

  1. ;; 使用MyMemory API的完整代码
  2. (defun getxml (url / xml http)
  3.   (if (setq http (vlax-create-object "WinHTTP.WinHTTPRequest.5.1"))
  4.     (progn
  5.       (vlax-invoke-method http "open" "GET" url :vlax-false)
  6.       (vlax-invoke-method http "send")
  7.       (vlax-invoke-method http "WaitForResponse" 5)
  8.       (setq xml (vlax-get-property http "ResponseText"))
  9.       (vlax-release-object http)
  10.       xml
  11.     )
  12.   )
  13. )
  14. (defun fy (word / url result start end str translated)
  15.   ;; 构建请求URL
  16.   (setq url (strcat
  17.     "https://api.mymemory.translated.net/get"
  18.     "?q=" (vl-string-translate " " "%20" word)
  19.     "&langpair=en|zh"
  20.     "&de=" "your-email@example.com"  ;; 可选,提高免费额度
  21.   ))
  22.   
  23.   ;; 获取结果
  24.   (setq result (getxml url))
  25.   
  26.   (if (and result (> (strlen result) 10))
  27.     (progn
  28.       ;; 查找翻译结果
  29.       (setq start (vl-string-search "\"translatedText\":\"" result))
  30.       (if start
  31.         (progn
  32.           (setq str (substr result (+ start 19)))
  33.           (setq end1 (vl-string-search "\"" str))
  34.           (if end1
  35.             (progn
  36.               (setq translated (substr str 1 end1))
  37.               
  38.               ;; 解码URL编码
  39.               (setq translated (vl-string-translate "%20" " " translated))
  40.               (setq translated (vl-string-translate "%25" "%" translated))
  41.               (setq translated (vl-string-translate "%0A" "\n" translated))
  42.               (setq translated (vl-string-translate "%0D" "\r" translated))
  43.               
  44.               ;; 解码JSON转义
  45.               (setq translated (vl-string-translate "\\\"" "\"" translated))
  46.               (setq translated (vl-string-translate "\\\\" "\\" translated))
  47.               (setq translated (vl-string-translate "\\/" "/" translated))
  48.               (setq translated (vl-string-translate "\\b" "\b" translated))
  49.               (setq translated (vl-string-translate "\\f" "\f" translated))
  50.               (setq translated (vl-string-translate "\\n" "\n" translated))
  51.               (setq translated (vl-string-translate "\\r" "\r" translated))
  52.               (setq translated (vl-string-translate "\\t" "\t" translated))
  53.               
  54.               ;; 清理空白字符
  55.               (setq translated (vl-string-trim " \t\n\r" translated))
  56.               
  57.               ;; 如果结果包含 %% 且不是正常的百分号,可能是解析问题
  58.               (if (and (vl-string-search "%%" translated)
  59.                        (not (vl-string-search "%" word)))  ;; 原文本没有%
  60.                 (progn
  61.                   ;; 尝试修复可能的解析错误
  62.                   (setq translated (vl-string-subst "%" "%%" translated))
  63.                 )
  64.               )
  65.               
  66.               translated
  67.             )
  68.             word  ;; 没有找到结束引号
  69.           )
  70.         )
  71.         word  ;; 没有找到翻译文本
  72.       )
  73.     )
  74.     word  ;; 结果无效
  75.   )
  76. )


  77. ;; 主命令函数
  78. (defun c:TTR (/ ss n e dt txt oldtxt newtxt)
  79.   (setvar "cmdecho" 0)
  80.   (princ "\n选择要翻译的文本对象: ")
  81.   
  82.   (if (setq ss (ssget '((0 . "TEXT,MTEXT"))))
  83.     (progn
  84.       (setq n 0)
  85.       (repeat (sslength ss)
  86.         (setq e (ssname ss n)
  87.               n (1+ n)
  88.               dt (entget e)
  89.               oldtxt (cdr (assoc 1 dt))
  90.         )
  91.         
  92.         (princ (strcat "\n翻译: \"" oldtxt "\""))
  93.         
  94.         ;; 调用翻译函数
  95.         (setq newtxt (fy oldtxt))
  96.         
  97.         (if (and newtxt (not (equal newtxt oldtxt)))
  98.           (progn
  99.             (entmod (subst (cons 1 newtxt) (assoc 1 dt) dt))
  100.             (princ (strcat " -> \"" newtxt "\""))
  101.           )
  102.           (princ " [翻译失败或未改变]")
  103.         )
  104.       )
  105.     )
  106.   )
  107.   (princ)
  108. )
  109. (defun T-string-subst (old new str / n)
  110.   (setq n (- (strlen new)))
  111.     (while (setq n (vl-string-search old str (min (+ n (strlen new)) (strlen str))))
  112.       (setq str (vl-string-subst new old str n))
  113.     )
  114.   str
  115. )

  116. (defun Unicode (translated / a b)

  117. ;(setq translated "\"u4f60\"u597d\"u4e16\"u754c")
  118. (setq a (T-string-subst "\"u" "\\U+" translated))
  119. (setq b(read (strcat "\""a"\"")))
  120.         (vl-princ-to-string b)
  121. )

  122. ;; 测试命令
  123. (defun c:TEST ()
  124.   (princ (Unicode(fy "hello-world")))
  125.   (princ)
  126. )

  127. (Unicode(fy "the sea"))
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-12-27 02:13 , Processed in 0.159908 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表