2009-03-04 37 views
18

我有一個像「foo%20bar」的字符串,我想要「foo bar」出來。如何在Emacs Lisp中「URL解碼」一個字符串?

我知道必須有一個內置函數來解碼Emacs Lisp中的URL編碼字符串(查詢字符串),但對於我而言,我今天無法在我的lisp /文件夾中找到它或與谷歌。

有人記得它叫什麼嗎?

回答

3

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

-1

我覺得你讓它有點太難: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

8

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的主要目的。

23

在我的情況下,我需要交互地做到這一點。以前的答案給了我正確的函數調用,那麼它只是一個包裝了一點,使他們互動的事情:

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

加入鹽,我的意思是根據口味結合鍵。

相關問題