Windows下外部程序交互时文件名编码

可能是我没事找事了,我在文件名里使用了中文。平常可以正常地打开写入文件,并且 Windows 自带的文件浏览器也可以正常显示。但是用 M-x diff 的时候就会:

D:/Git/usr/bin/diff.exe -u "d:/LISP-test/elisp/diff-test/文件2.txt" "d:/LISP-test/elisp/diff-test/文件1.txt"
--- "d:/LISP-test/elisp/diff-test/\346\226\207\344\273\2662.txt"	2026-01-03 04:00:24.674581000 +0800
+++ "d:/LISP-test/elisp/diff-test/\346\226\207\344\273\2661.txt"	2026-01-03 04:00:16.195637800 +0800

出现类似这样的数字。这串数字应该可以这样解码:

(decode-coding-string
 (encode-coding-string
  (string #o346 #o226 #o207 #o344 #o273 #o266)
  'iso-8859-1)
 'utf-8)

输出的字符串是 “文件”。

有时候会报错 “找不到文件”,然后输出乱码的文件名。但是我不知道是什么原因决定了文件名乱码还是变成数字。

同样问题,所以我diff用的两个txt都用英文命名(old/new.txt),不会出错能正常diff

编辑:测试了下,也可以用下列代码兼容中文名

(when (eq system-type 'windows-nt)
  (add-to-list 'process-coding-system-alist
               '("[rR][gG]" . (utf-8 . gbk-dos)))
  ;;ffmpeg的中文名兼容
  (add-to-list 'process-coding-system-alist
               '("[fF][fF][mM][pP][eE][gG]" . (utf-8 . gbk-dos)))
  ;;顺便把cwebp也兼容了
  (add-to-list 'process-coding-system-alist
               '("[cC][wW][eE][bB][pP]" . (utf-8 . gbk-dos)))
  ;; 还有pandoc
  (add-to-list 'process-coding-system-alist
               '("[pP][aA][nN][dD][oO][cC]" . (utf-8 . gbk-dos)))
  ;; diff
  (add-to-list 'process-coding-system-alist
               '("[dD][iI][fF][fF]" . (utf-8 . gbk-dos))))