我该如何在Emacs Lisp中进行“URL解码”?

32

我有一个字符串,如“foo%20bar”,我想从中得到“foo bar”。

我知道Emacs Lisp中必须有一个内置函数来解码URL编码的字符串(查询字符串),但我却找不到它了,无论是在我的文件夹中还是通过谷歌搜索。

这个函数叫什么名字?

6个回答

49
url-unhex-string

我的url-unhex-string与Emacs 25不匹配 :/ - Natim
2
你可能需要(require 'url-util) -- 在实践中,这通常会被一些其他的代码加载完成,但是依赖于这种方式并不好。 - Derek Slager

30

在我的情况下,我需要以交互方式执行此操作。先前的答案给了我要调用的正确函数,然后只需稍微包装一下就可以使它们具有交互性:

(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))

加盐,我的意思是按照口味绑定到键。


11

Emacs自带URL库,提供了一系列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,因为解析URL是它的主要目的。


喜欢这个例子! - McBear Holden

6

org-link-unescape 只能处理非常简单的情况 ... w3m-url-decode-string 更好,但它不是内置的,并且我本地的版本与 Emacs 23 不兼容。


现在这样已经足够好了。不过奇怪的是它只使用了一个常量列表,其中包含17个字符。也许我以后会修复它。 - Ken
15
url-unhex-string 可以实现你想要的功能。 - Cheeso

3
你可以从MELPA获取urlenc,并使用urlenc:decode-region对区域进行编码或使用urlenc:decode-insert交互式插入文本。

0
我认为你可能把它想得太难了:split-string 可能已经满足了你大部分的需求。如果需要更高级的功能,可以看一下 url-expand.el 中的函数;不幸的是,其中许多函数没有文档字符串,所以你可能需要阅读代码。 url-generic-parse-url 看起来是一个潜在的赢家。

嗯,也许我说错了。我有一个字符串,像是"foo%20bar",我想从中得到"foo bar"。我不知道split-string、url-generic-parse-url或者url-expand.el中的任何函数能够帮上忙。 - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接