wsug
1
最初在解决一个 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)
1 个赞
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)
试试这个?
wsug
5
除了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))
))
wsug
6
感谢提醒,搜索到 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)
Youmu
7
这个问题跟我上次遇到的比较像,也是在使用 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 的也能处理了。