Как URL декодировать строку в Emacs Lisp?

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

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

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


person Ken    schedule 04.03.2009    source источник


Ответы (6)


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

person Derek Slager    schedule 04.03.2009
comment
Пока этого достаточно. Странно, что он использует только постоянный список из 17 символов. Может быть, я когда-нибудь это исправлю. - person Ken; 05.03.2009
comment
url-unhex-string делает то, что вы хотите. - person Cheeso; 12.05.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))

Добавить соль, я имею в виду привязать к клавишам по вкусу.

person db48x    schedule 30.06.2011

Emacs поставляется с библиотекой URL-адресов, которая предоставляет набор функций анализа URL-адресов, как хуайюань и 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.

person viam0Zah    schedule 28.04.2009
comment
люблю этот пример! - person McBear Holden; 15.11.2016

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

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

person Charlie Martin    schedule 04.03.2009
comment
Хм, может быть, я оговорился. У меня есть строка вроде foo%20bar, и я хочу убрать из нее foo bar. Я не вижу, как здесь помогает split-string или url-generic-parse-url или что-то еще в url-expand.el. - person Ken; 04.03.2009

Вы можете взять urlenc из MELPA и использовать urlenc:decode-region для региона или urlenc:decode-insert для интерактивной вставки текста.

person elig    schedule 24.05.2021

person    schedule
comment
У меня есть url-unhex-string, не совпадающий с Emacs 25:/ - person Natim; 22.01.2019
comment
Вам может понадобиться (требуется 'url-util) - на практике это часто будет выполняться загрузкой какого-либо другого кода, но, конечно, не стоит полагаться на это. - person Derek Slager; 12.05.2020