2016-10-27

org2blogでpublish時に固まる(Emacs25.1, xml-rpc 20160430.1458)

Emacs25.1にしたせい(?)か org2blog でpublish時に “error in process sentinel: url-http-create-request: Multibyte text in HTTP request: POST /????/xmlrpc.php HTTP/1.1 …” とか言われて困ったのだけど xml-rpc-request の encode-coding-region の部分がダメっぽい。 xml-rpc-allow-unicode-string が t の時は encode-coding-string を使うようにしたらうまく行った。

xml-rpc.el:

                                         " encoding=\"UTF-8\"?>\n"
                                         (with-temp-buffer
                                           (xml-print xml)
-                                          (when xml-rpc-allow-unicode-string
-                                            (encode-coding-region
-                                             (point-min) (point-max) 'utf-8))
-                                          (buffer-string))
+                                          (if xml-rpc-allow-unicode-string
+                                              (encode-coding-string (buffer-string) 'utf-8)
+                                            (buffer-string)))
                                         "\n"))
               (url-mime-charset-string "utf-8;q=1, iso-8859-1;q=0.5")
               (url-request-coding-system xml-rpc-use-coding-system)

Emacs25からurl-http-系でリクエストを送るときはユニバイト文字列でないとエラーになるようになった(https://github.com/emacs-mirror/emacs/blob/master/etc/NEWS.25#L1306)。 RC1のときはユニバイト文字列を指定してもエラーになるバグがあったようなのだけど、今回のはそれではないようだ。

原因は以下の挙動の違いらしい。

(multibyte-string-p
 (with-temp-buffer
  (insert "こんにちは")
  (encode-coding-region (point-min) (point-max) 'utf-8)
  (buffer-string))) ;; => t
(multibyte-string-p (encode-coding-string "こんにちは" 'utf-8)) ;; => nil

encode-coding-regionの説明には「符号化結果は『生のバイト』であるが、 マルチバイトであったバッファはマルチバイトのままである。」とあるので、それが関係しているのかもしれない。

Pingback / Trackback