Как «декодировать URL» строку в Emacs Lisp? - PullRequest
21 голосов
/ 04 марта 2009

У меня есть строка типа "foo% 20bar", и я хочу использовать "foo bar".

Я знаю, что должна быть встроенная функция для декодирования строки в кодировке URL (строки запроса) в Emacs Lisp, но сегодня я не могу найти ее ни в своей папке lisp /, ни в с Google.

Кто-нибудь помнит, как это называется?

Ответы [ 5 ]

41 голосов
/ 05 марта 2009
url-unhex-string
24 голосов
/ 01 июля 2011

В моем случае мне нужно было сделать это в интерактивном режиме. Предыдущие ответы давали мне нужные функции для вызова, тогда нужно было просто немного обернуть их, чтобы сделать их интерактивными:

(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 голосов
/ 28 апреля 2009

Emacs поставляется с библиотекой URL , которая предоставляет набор функций парсинга URL - как уже отмечали huaiyuan и Charlie 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.

4 голосов
/ 04 марта 2009

org-link-unescape делает работу для очень простых случаев ... w3m-url-decode-string лучше, но она не встроена, и у меня локально не работает версия с Emacs 23.

0 голосов
/ 04 марта 2009

Я думаю, вы делаете это слишком сложно: split-string, вероятно, сделает большинство того, что вы хотите. Для более интересных вещей взгляните на функции в url-expand.el; к сожалению, у многих из них нет строк документации, поэтому вам, возможно, придется читать код.

url-generic-parse-url выглядит как потенциальный победитель.

...