如何在minibuffer中显示web后端返回的中文内容

最初在解决一个 undo的问题时 是遇到这个情况,当时没处理,今天又来看了一下,发现还是不知道怎么解决,只好来论坛发贴请教。比如以下代码

(with-current-buffer
   (url-retrieve-synchronously "http://localhost/t/测试.php")
   (goto-char (point-min))
   (re-search-forward "^$")
   (delete-region (point) (point-min))
   (buffer-string))

url路径中用的是中文没问题,执行时在minibuffer中输出服务端返回的内容,但文本中包含中文的部分乱码不能正常显示。

win10 emacs27 我的编码设置只用了这一句(prefer-coding-system 'utf-8)

url-retrieve-synchronously 返回 buffer 的 encoding 不是 multibyte 吧,应该需要手动开启 multibyte

(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)

试试这个?

试了一下,并无效果

除了url-retrieve-synchronously ,另一个异步的url-retrieve也用过还是如此,如何手动开启multibyte

(url-retrieve 
   "http://localhost/t/测试.php"
   (lambda (status)
      (goto-char (point-min))
      (re-search-forward "^$")
      (delete-region (+ (point) 1) (point-min))
      (message (buffer-string))
      ))

感谢提醒,搜索到 http://bty-diary.sblo.jp/article/186124648.html 发现string-as-multibyte这个方法,加上去就能显示中文了。

(with-current-buffer
   (url-retrieve-synchronously "http://localhost/t/测试.htm")
   (goto-char (point-min))
   (re-search-forward "^$")
   (delete-region (point) (point-min))
   (string-as-multibyte (buffer-string)))

更新,仔细看了string-as-multibyte的文档才发现这个函数已经过时了,现在用的是(decode-coding-string (buffer-string) 'utf-8-auto-dos)

这个问题跟我上次遇到的比较像,也是在使用 url-retrieve 的时候遇到的,同样也是编码的问题。

https://lists.gnu.org/archive/html/bug-gnu-emacs/2021-09/msg00327.html

Lars 提到了说那个时候包含 http resp 的那个 buffer 还没有正确的 encoding (因为它开头是 http header, 认为是 ascii 编码), 无法自动识别 http content 的编码,所以需要一个新的 buffer 来重新显示 http content,这样 Emacs 就可以自动地猜测编码并正确显示了,而不需要手工使用 decode-coding-string

这样的一个好处是更有通用性,即使是非 utf-8 的也能处理了。