Windows语言对系统剪贴板字符编码的影响?

字符编码抄的 Tumashu 编码配置 https://github.com/tumashu/emacs-helper/blob/master/eh-basic.el

  (set-language-environment "UTF-8")
  (set-buffer-file-coding-system 'utf-8-unix)
  (set-clipboard-coding-system 'utf-8-unix)
  (set-file-name-coding-system 'utf-8-unix)
  (set-keyboard-coding-system 'utf-8-unix)
  (set-next-selection-coding-system 'utf-8-unix)
  (set-selection-coding-system 'utf-8-unix)
  (set-terminal-coding-system 'utf-8-unix)
  (cond
   ( (eq system-type 'windows-nt)
    (set-language-environment "Chinese-GBK")
    (set-file-name-coding-system 'gbk-dos)
    (set-selection-coding-system 'gbk-dos)
    (set-next-selection-coding-system 'gbk-dos)
    (set-clipboard-coding-system 'gbk-dos))
   ( (eq system-type 'cygwin)
      (when (display-graphic-p)
      (set-selection-coding-system 'gbk-unix)
      (set-next-selection-coding-system 'gbk-unix)
	  (set-clipboard-coding-system 'gbk-unix) ) )
   )

在粘贴系统剪贴板时发现一个现象,如果复制时系统语言是中文(不是输入法中/英状态),回到emacs里粘贴,无论此时再切换为什么语言,文本粘贴一切正常;

但如果复制时系统语言是英文(不是输入法中/英状态),回到emacs里粘贴,无论此时再切换为什么语言,粘贴出来的文本,中文显示问号。

搜狗截图20230820135541

我以为是 (set-language-environment "Chinese-GBK")这句问题,但注释掉也是一样的现象。该如何解决?求助道友,感谢!

环境:Windows 10原生GNU Emacs 28.2。

把你那些编码设置全部注释掉再看一下正常不

试过了,把cond之前的设置都注释掉,还是一样的。

在 Windows 下 Emacs 默认就是用的 GBK 编码,不用这些编码设置。不建议在 Windows 下 设置 (set-language-environment "UTF-8")

注释了也一样的。 而且在Windows下,cond里面设置了Chinese-gbk,会覆盖上面的utf8。

你可以用 M-x describe-current-coding-system 看看当前的编码设置情况

Coding system for inter-client cut and paste:
  U -- utf-16le-dos

结果是c – gbk-dos

设置 (set-selection-coding-system 'utf-16le-dos) 试试看

试了,现在inter-client cut and paste的编码是utf-16le-dos了。但表现很诡异。 一直保持系统语言英文,第一次复制,粘贴还是中文问号;但第二次及以后再复制,粘贴出来就正常了。 有时候,第一次复制粘贴也是正常的。

那就不清楚是什么问题了。我这边 Windows 10 用的系统默认的语言和区域设置,Emacs 设置的 utf-8, 目前使用下来没什么问题。

我目前的编码设置只有这些,放在 early-init.el 中:

(set-charset-priority 'unicode)
(prefer-coding-system 'utf-8)
(setq system-time-locale "C")

(when (eq system-type 'windows-nt)
  (setq file-name-coding-system 'gbk) ;; 如果用 emacsclient 才要设置这个,不然无法打开中文名字的文件
  (add-to-list 'process-coding-system-alist '("sdcv" . (utf-8-dos . chinese-gbk-dos)))
  (add-to-list 'process-coding-system-alist '("rg" . (utf-8-dos . gbk))))

可以参考下之前的讨论:

1 个赞