]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix unpacking ZIP archives on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Wed, 16 Aug 2023 12:34:09 +0000 (15:34 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 16 Aug 2023 12:34:09 +0000 (15:34 +0300)
* lisp/arc-mode.el (archive-zip-summarize): Decode file names as
UTF-8 when bit 11 of flags is set, even on MS-Windows.
(Bug#65305)

lisp/arc-mode.el

index 5e696c091b2c89f32c64db3614685d9a3b2aec75..05a71fb4c5a0cbf31d0b1a7b587624baca5c5085 100644 (file)
@@ -1990,6 +1990,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
     (setq p (+ p (point-min)))
     (while (string= "PK\001\002" (buffer-substring p (+ p 4)))
       (let* ((creator (get-byte (+ p 5)))
+             (gpflags (archive-l-e (+ p 8) 2))
             ;; (method  (archive-l-e (+ p 10) 2))
              (modtime (archive-l-e (+ p 12) 2))
              (moddate (archive-l-e (+ p 14) 2))
@@ -2001,7 +2002,12 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
              (efnname (let ((str (buffer-substring (+ p 46) (+ p 46 fnlen))))
                        (decode-coding-string
                         str
-                         (or (if (and w32-fname-encoding
+                         ;; Bit 11 of general purpose bit flags (bytes
+                         ;; 8-9) of Central Directory: 1 means UTF-8
+                         ;; encoded file names.
+                         (or (if (/= 0 (logand gpflags #x0800))
+                                 'utf-8-unix)
+                             (if (and w32-fname-encoding
                                       (memq creator
                                             ;; This should be just 10 and
                                             ;; 14, but InfoZip uses 0 and