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

问题描述:

我有一个像“foo%20bar”的字符串,我想要“foo bar”出来。如何在Emacs Lisp中“URL解码”一个字符串?

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

有人记得它叫什么吗?

org-link-unescape做这项工作最简单的情况...... w3m-url-decode-string是更好的,但它不是建立在和我的版本本地不使用Emacs工作23

+0

现在已经够好了。但奇怪的是,它只使用17个字符的恒定列表。也许我会在某个时候解决这个问题。 – Ken 2009-03-04 21:07:21

+8

`url-unhex-string`做你想做的。 – Cheeso 2011-05-12 12:22:50

我觉得你让它有点太难:split-string可能会做你想要的大部分。对于爱好者来说,看看url-expand.el中的功能;不幸的是,其中许多人没有文档字符串,所以你可能需要阅读代码。

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

+0

嗯,也许我错过了。我有一个像“foo%20bar”的字符串,我想要“foo bar”。我没有看到split-string或url-generic-parse-url或url-expand.el中的任何内容在这里确实有帮助。 – Ken 2009-03-04 19:07:38

url-unhex-string 

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因为它其解析URL的主要目的。

在我的情况下,我需要交互地做到这一点。以前的答案给了我正确的函数调用,那么它只是一个包装了一点,使他们互动的事情:

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

加入盐,我的意思是根据口味结合键。