讨论一下 Emacs 中的 UTF-8 编码设置

最近又研究了下 Emacs 在 Windows平台 下的编码问题。

为了使不同平台共享方便,我要统一使用 UTF-8 编码。只在 early-init.el 中加入下面的代码:

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

上面的设置可以解决的问题:

  • 解决 Haskell-mode 的 REPL 无法启动,或者 putStrLn 没法在 REPL 打印中文的问题。
  • 新建文件时默认使用的是 UTF-8 编码,而不是 GBK 编码
  • 保存 Buffer 时不会经常提示选择编码

但也产生了新的问题:

  • M-x run-python 中没法通过 print 打印中文,因为 python 默认使用的不是 UTF-8 编码。可以在参数中加入 -X utf-8 ,或者设置环境变量 PYTHONIOENCODING 的值为 utf-8, 就可以解决。

    (setq python-shell-interpreter-args "-i -X utf-8")
    ;; 或者在系统中创建,或者在 Emacs 中设置下面的环境变量
    (setenv "PYTHONIOENCODING" "utf-8")
    
  • 在右键菜单中设置 Open with Emacs (Emacsclient) 打开有中文名称的文件时,文件名会乱码。可以通过下面的设置解决

(when (eq system-type 'windows-nt)
  (setq file-name-coding-system 'gbk))
  • 默认输入法 default-input-method 人值由 nil 变为了 chinese-py-punct。我个人不用 C-\切换输入法,这个对我没影响。

如果其他地方还有问题的话,可以单独进行设置编码。这也是 Emacs 维护者 Eli 比较推荐的方式。 比如 sdcv 这个本地翻译程序比较老,输出内容还是 GBK 编译的,可以用以下设置进行针对性更改。

(add-to-list 'process-coding-system-alist '("sdcv" . (utf-8-dos . chinese-gbk-dos)))

平时遇到编码问题可以通过 M-x escribe-current-coding-system 查看当前 Buffer 的编码设置情况。

9 个赞