From 2674b6a08a90b9a97d3adf2b3e4497b61880e173 Mon Sep 17 00:00:00 2001 From: dickmao Date: Fri, 7 Feb 2020 19:33:13 -0500 Subject: [PATCH] Question assumption that mm source buffer is unibyte In my Gnus experience, the source buffer that mm-shr acts upon can be multibyte. * lisp/gnus/mm-decode.el (mm-with-part): propagate multibyte/unibyte setting from source buffer to target. * test/lisp/gnus/mm-decode-tests.el (test-mm-decode-multibyte): add test --- lisp/gnus/mm-decode.el | 8 ++----- test/lisp/gnus/mm-decode-tests.el | 39 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 test/lisp/gnus/mm-decode-tests.el diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index d33bb56dc9..19a18b4f45 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -1255,16 +1255,12 @@ mm-handle-displayed-p (defmacro mm-with-part (handle &rest forms) "Run FORMS in the temp buffer containing the contents of HANDLE." - ;; The handle-buffer's content is a sequence of bytes, not a sequence of - ;; chars, so the buffer should be unibyte. It may happen that the - ;; handle-buffer is multibyte for some reason, in which case now is a good - ;; time to adjust it, since we know at this point that it should - ;; be unibyte. `(let* ((handle ,handle)) (when (and (mm-handle-buffer handle) (buffer-name (mm-handle-buffer handle))) (with-temp-buffer - (mm-disable-multibyte) + (set-buffer-multibyte (buffer-local-value 'enable-multibyte-characters + (mm-handle-buffer handle))) (insert-buffer-substring (mm-handle-buffer handle)) (mm-decode-content-transfer-encoding (mm-handle-encoding handle) diff --git a/test/lisp/gnus/mm-decode-tests.el b/test/lisp/gnus/mm-decode-tests.el new file mode 100644 index 0000000000..8a9d471b74 --- /dev/null +++ b/test/lisp/gnus/mm-decode-tests.el @@ -0,0 +1,39 @@ +;;; mm-decode-tests.el --- tests for gnus/mm-decode.el -*- lexical-binding:t -*- + +;; Copyright (C) 2019-2020 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Code: + +(require 'ert) +(require 'mm-decode) + +(ert-deftest test-mm-decode-multibyte () + (should + (or (not (fboundp 'libxml-parse-html-region)) + (with-temp-buffer + (set-buffer-multibyte t) + (save-excursion + (insert "

最近也想尝试,但是感觉蛮难的,比如不知道如何在")) + (let ((handle (mm-make-handle + (current-buffer) + (rfc2231-parse-qp-string + "Content-Type: text/html; charset=UTF-8")))) + (not (zerop (length (with-temp-buffer (mm-shr handle) + (buffer-string)))))))))) + +;;; mm-decode-tests.el ends here -- 2.24.1