2009-03-04 12 views
18

Ich habe eine Zeichenfolge wie "foo% 20bar" und ich möchte "foo bar" daraus machen.Wie "URL decodieren" eine Zeichenfolge in Emacs Lisp?

Ich weiß, dass es eine eingebaute Funktion geben muss, um eine URL-kodierte Zeichenfolge (Abfragezeichenfolge) in Emacs Lisp zu dekodieren, aber für das Leben von mir kann ich es heute weder in meinem Lisp/Ordner finden oder mit Google.

Jeder erinnert sich, wie es heißt?

Antwort

3

org-link-unescape macht den Job für sehr einfache Fälle ... w3m-url-decode-string ist besser, aber es nicht gebaut wird, und die Version, die ich vor Ort haben funktioniert nicht mit Emacs 23.

+0

Das ist gut genug für jetzt. Es ist seltsam, dass es nur eine konstante Liste von 17 Zeichen verwendet. Vielleicht werde ich das irgendwann beheben. – Ken

+8

'url-unhex-string' macht was Sie wollen. – Cheeso

-1

Ich denke, Sie machen es ein wenig zu hart: split-string wird wahrscheinlich das meiste tun, was Sie wollen. Für etwas schickere Sachen, werfen Sie einen Blick auf die Funktionen in url-expand.el; Leider haben viele von ihnen keine Doc-Strings, daher müssen Sie möglicherweise Code lesen.

url-generic-parse-url sieht wie ein potenzieller Gewinner aus.

+0

Hmm, vielleicht habe ich falsch verstanden. Ich habe eine Saite wie "foo% 20bar" und ich möchte "foo bar" daraus machen. Ich sehe nicht, wie Split-String oder URL-Generic-Parse-URL oder irgendetwas in URL-Expand.el hier wirklich hilft. – Ken

8

Emacs ausgeliefert mit einem URL library, die eine Reihe von URL-Parsing-Funktionen bietet - wie huaiyuan und Charlie Martin bereits darauf hingewiesen. Hier ist ein kleines Beispiel, das Ihnen eine Idee geben würde, wie es zu benutzen:

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

Ich denke, besser ist darauf zu verlassen, als org-mode wie es sein Hauptzweck ist URL zu analysieren.

+0

liebe dieses Beispiel! – osager

23

In meinem Fall musste ich das interaktiv tun. Die bisherigen Antworten gab mir die richtigen Funktionen zu nennen, dann war es nur eine Frage der Verpackung es ein wenig, um sie interaktiv zu machen:

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

Salz hinzufügen, ich meine nach Geschmack Schlüssel binden.