2009-08-26 4 views
4

私は現在、pastie.elの精神でブログ投稿を作成するためのレストクライアントを作成しています。主な目的は、私がemacsでテキスタイルを書いて、それを作成するRailsアプリケーションへのポストを作ることです。私はスペイン語か日本語のいずれかで何かをタイプするまでうまくいっています。そして、私は500エラーを受け取ります。 pastie.elにもこの同じ問題があります。ここでemacs:utf-8の問題でurl elispパッケージを使用したPOSTを作成する

は、コードは次のとおりです。

(「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'(途中で動作します)になります。

この問題を回避するにはどうすればよいですか?

EDIT: '*'は* 'と等価ではありません。私が意味していたことは、たとえば 'sgml-char'を使ってutf-8にemacsを使ってエンコードした場合、ポスト全体がutf-8でエンコードされることになります。 like * Textile太字*これにより、RedClothはhtmlに変換できません。申し訳ありませんが、それは非常に悪い説明されました。

+0

Emacsのバージョン? application/xmlなしヘッダー? 最後に、*と*が接続の反対側で同等でない場合は、XMLを使用していません。 – jrockway

+0

よろしくお願いいたします。 xmlヘッダーを追加しました。私はEmacs 23.0を使用しています。ありがとう。 – wallyqs

+0

確かに約*は*と同等ですか?私はかつてこれを見たことがなく、XMLの5つの必須エンティティの1つではありません。 Emacsがそれを生成するとバグだと言いたい。 – legoscia

答えて

6

推測:あなたはurl-request-data代わり

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

に設定されている場合、それは動作しますか?

実際にどのコーディングシステムを使用しているかをURLに伝えることは何もないので、自分でデータをエンコードする必要があります。これはまた正しいContent-lengthヘッダーを与えるべきです、それはちょうど(length url-request-data)から来ます、明らかにほとんどのUTF-8文字列のために間違った結果を与えるでしょう。

+0

ttttttThanks !!!これがそれでした。知識を共有してくれてありがとう! – wallyqs

2

@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 
関連する問題