Создание POST с пакетом url elisp в emacs: проблема utf-8 - PullRequest
4 голосов
/ 26 августа 2009

В настоящее время я создаю клиент Rest для создания постов в блоге в духе pastie.el. Основная цель для меня - написать текстиль в emacs и сделать сообщение в приложении Rails, которое его создаст. Он работает нормально, пока я не наберу что-нибудь на испанском или японском, тогда я получаю ошибку 500. У pastie.el такая же проблема, кстати.

Вот код:

(требуется 'url)

(defun create-post()

(interactive)

(let ((url-request-method "POST")

    (url-request-extra-headers '(("Content-Type" . "application/xml")))

    (url-request-data (concat "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                              "<post>"
                              "<title>"
                              "Not working with spanish nor japanese"
                              "</title>"
                              "<content>"
                              ;; "日本語"   ;; not working
                              ;; "ñ"        ;; not working either
                              "h1. Textile title\n\n"
                              "*Textile bold*"
                              "</content>"
                              "</post>"))
    )                               ; end of let varlist
(url-retrieve "http://127.0.0.1:3000/posts.xml"
              ;; CALLBACK
              (lambda (status)
                (switch-to-buffer (current-buffer)))
              )))

Единственный способ, которым я могу представить себе сейчас, что проблему можно решить, это заставить emacs кодировать символы utf-8 так, чтобы 'ñ' стало '& # 241' (что работает кстати).

Каким образом можно обойти эту проблему?

РЕДАКТИРОВАТЬ: '*' не эквивалентно & ast; '. Я имел в виду, что если я закодирую в utf-8 с помощью emacs, используя, например, 'sgml-char', то весь пост станет закодированным в utf-8. Как & ast; Текстиль жирный & ast; таким образом, делая RedCloth не в состоянии конвертировать его в HTML. Извините, это было очень плохо объяснено.

Ответы [ 2 ]

6 голосов
/ 26 августа 2009

Предположение: это работает, если вы установите url-request-data на

(encode-coding-string (concat "<?xml etc...") 'utf-8)

вместо

На самом деле нечего сказать, какую систему кодирования вы используете, так что, я думаю, вам придется самостоятельно кодировать свои данные. Это также должно дать правильный заголовок Content-length, поскольку он просто приходит от (length url-request-data), что, очевидно, даст неверный результат для большинства строк UTF-8.

2 голосов
/ 26 августа 2009

Благодаря @legoscia теперь я знаю, что мне нужно самостоятельно кодировать данные. Я опубликую функцию здесь для дальнейшего использования:

(require 'url)

(defun create-post()
(interactive)
(let ((url-request-method "POST")
    (url-request-extra-headers '(("Content-Type" . "application/xml; charset=utf-8")))
    (url-request-data
     (encode-coding-string (concat "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"                                  
                                   "<post>"
                                   "<title>"
                                   "Not working with spanish nor japanese"
                                   "</title>"
                                   "<content>"
                                   "日本語\n\n"   ;; working!!!
                                   "ñ\n\n"        ;; working !!!
                                   "h1. Textile title\n\n"
                                   "*Textile bold*"
                                   "</content>"
                                   "</post>") 'utf-8)
     )
    )                               ; end of let varlist
(url-retrieve "http://127.0.0.1:3000/posts.xml"
              ;; CALLBACK
              (lambda (status)
                (switch-to-buffer (current-buffer))
                ))))                 ;let
...