如何在Emacs Lisp中“解码”一个字符串?

时间:2009-03-04 18:24:40

标签: url emacs elisp urlencode urldecode

我有一个像“foo%20bar”的字符串,我想要“foo bar”。

我知道必须有一个内置函数来解码Emacs Lisp中的URL编码字符串(查询字符串),但对于我的生活,我今天找不到它,无论是在我的lisp /文件夹中还是与谷歌。

有人记得它的名字吗?

6 个答案:

答案 0 :(得分:41)

url-unhex-string

答案 1 :(得分:24)

在我的情况下,我需要以交互方式进行此操作。以前的答案给了我正确的调用功能,然后只需要将它包装一点就可以使它们互动:

(defun func-region (start end func)
  "run a function over the region between START and END in current buffer."
  (save-excursion
    (let ((text (delete-and-extract-region start end)))
      (insert (funcall func text)))))

(defun hex-region (start end)
  "urlencode the region between START and END in current buffer."
  (interactive "r")
  (func-region start end #'url-hexify-string))

(defun unhex-region (start end)
  "de-urlencode the region between START and END in current buffer."
  (interactive "r")
  (func-region start end #'url-unhex-string))

添加盐,我的意思是根据口味绑定到钥匙。

答案 2 :(得分:11)

Emacs附带URL library,它提供了一堆URL解析功能 - 已经指出huaiyuanCharlie Martin。这是一个小例子,它可以让你知道如何使用它:

(let ((url "http://www.google.hu/search?q=elisp+decode+url&btnG=Google+keres%E9s&meta="))
  ;; Return list of arguments and values
  (url-parse-query-string
   ;; Decode hexas
   (url-unhex-string
    ;; Retrieve argument list
    (url-filename
     ;; Parse URL, return a struct
     (url-generic-parse-url url)))))
=> (("meta" "") ("btnG" "Google+keresés") ("/search?q" "elisp+decode+url"))

我认为依赖它比org-mode更好,因为 是解析网址的主要目的。

答案 3 :(得分:4)

org-link-unescape可以处理非常简单的情况...... w3m-url-decode-string更好,但它没有内置,我本地的版本不能与Emacs 23一起使用。

答案 4 :(得分:0)

我认为你有点太难了:split-string可能会做你想要的大部分事情。对于更高级的东西,看看url-expand.el中的函数;不幸的是,他们中的许多人没有文档字符串,所以你可能不得不阅读代码。

url-generic-parse-url看起来像是潜在的赢家。

答案 5 :(得分:0)

您可以从 MELPA 中获取 urlenc 并使用 urlenc:decode-region 表示区域或使用 urlenc:decode-insert 以交互方式插入您的文本