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

挺奇怪的,只有一个文件有这个问题,而且每次设置完 utf-8-dos 后,kill掉buffer再打开,就会多一个^M

不管了,我直接git恢复了。编码问题是真的奇怪,我发现有的buffer是 prefer-utf-8-dos, 有的是 utf-8-dos

这个是真的怪,可能是因为你这个 buffer 默认没有指定编码类型。

可见版本控制是多么重要。:grinning_face_with_smiling_eyes:

总结一下:
在 Windows 系统下尝试了以下两种配置:

(set-locale-environment "en_US.UTF-8") 
(set-language-environment "UTF-8")

大部分情况下正常,但都没法解决在 M-x shell 出现乱码的问题。

所以目前我还是用回以前一直使用的配置:

这个配置其实是从 Purcell 的配置中来的,用了几年了。

至于个人Emacs 配置的跨平台分享,目前 Git 设置如下,保证Github 中都是 LF换行符:
在 macOS 和 Linx 系统中

 git config --global core.autocrlf input # 只有在 pull 的时候转为 Unix 编码的 LF 换行

在 Windows 中自动转为 dos 编码的 CRLF 换行

 git config --global core.autocrlf true # 在 clone 和 pull 的时候转为 `CRLF`,在 push 时转为` LF`

对于有的项目,如果只用于 Windows 平台,就在项目中加入.gitattributes 文件,设置需要的回车换行风格为 CRLF,不需要自动转换。这个文件的设置会忽略 Git 的全局设置。

参考Github 文档 :

1 个赞

describe-current-coding-system比较两种方案的区别,发现只用set-language-environment其实是可以的

(set-language-environment "UTF-8")
(prefer-coding-system 'gbk)
(prefer-coding-system 'utf-8)

如上设置,shell 不会出现乱码在windows上

1 个赞

看了下 set-locale-environment 的代码,实际上就是多修改了几个变量,同时根据输入的参数来合适地调用set-language-environment 。而且还对各系统做了一些特殊处理貌似,对于windows也就是一些变量保持windows默认,其他的就是多设置一点这样。

比如(set-locale-environment "en_US.UTF-8")实际上会执行

(set-language-environment "English")

这跟(set-language-environment "UTF-8")效果应该会不一样。(charset-priority-list)就会不一样,其他的由set-language-environment设置的变量都可能变化。

(set-locale-environment "UTF-8")除了多设置了几个变量以外,应该跟(set-language-environment "UTF-8")效果是一样的,因为前者就是直接调用了后者。

这带来了问题,实际上set-locale-environment并没有比set-language-environment多做多少工作,reddit原文上也只是理解成不推荐set-locale-environment而推荐set-language-environment,这就让人很费解。我觉得如果有问题,当然实际上也存在问题,set-language-environment也应该也有才正确。

Windows 上的编码问题很头痛,实在搞不清楚。

最近重装了 Windows 10 系统, 还是用下面的编码设置,但 M-x shell 没乱码了。系统用的默认区域设置。