emacs显示http结果到buffer时异常

2016-06-15  本文已影响73人  齐格Insight

今天用elisp写了一个http的ajax调用:

(defun ab/ajax-build-status (arg)
  "ajax pelpa building status"
  (interactive "P")
  (let* ((pelpa-build-status-url "http://pelpa.popkit.org/elpa/build/ajaxBuildStatus.json")
         (pelpa-buffer-name "*pelpa*")
         (pelpa-buffer (get-buffer-create pelpa-buffer-name))
         (buffer (url-retrieve-synchronously pelpa-build-status-url))
         (headers nil)
         (handle nil))
    (if (not buffer)
        (error "请求%s失败,请重试!" pelpa-build-status-url))
    (with-current-buffer buffer
      (unless (= 200 url-http-response-status)
        (error "Http error %s fetching %s" url-http-response-status pelpa-build-status-url))
      (message "buffer name%s" (buffer-name))
      (setq headers (buffer-string))
      
      (with-current-buffer pelpa-buffer
        (setq-default major-mode 'text-mode)
        (set-buffer-major-mode pelpa-buffer)
        (erase-buffer)     ;; 先清空原有的内容
        (insert headers))
      )))

发现返回结果的buffer,中文显示不正常:

Paste_Image.png

出现了\345\274\200\345\247\213\344\272\216..
原因是没有将字符串进行decode(调用decode-coding-string函数)
将上面的(insert headers)替换为如下语句就ok了:

(insert (decode-coding-string headers 'utf-8))

显示正常如下:

Paste_Image.png
后来发现有人遇到过,其实url.el应该按照http的content-type类型来decode才对:
http://emacs.stackexchange.com/questions/4100/why-must-i-set-and-reset-buffer-multibyte-to-correctly-view-multibyte-buffers
上一篇下一篇

猜你喜欢

热点阅读