Emacs编码总结

文章目录

  1. 1. 查看编码
    1. 1.1. 查看编码系统中具体某个coding的说明
    2. 1.2. 查看当前正在使用的编码系统
    3. 1.3. 显示Emacs支持的所有编码系统
  2. 2. 改变编码
    1. 2.1. 更改编码系统优先级
    2. 2.2. 设置文件存储的编码
    3. 2.3. 设置文件显示的编码
    4. 2.4. 设置下一个指令的编码
    5. 2.5. 不做任何编码转换地查看文件
  3. 3. 总结
  4. 4. 经验
    1. 4.1. Shell中与其它程序进行交互乱码问题

在Windows上使用Emacs经常会遇到乱码问题,每次都让人很闹心,主要原因是还是对Emacs编码不熟悉,下面将Emacs的编码系统梳理一下,并总结了一下自己的使用经验。

查看编码

在Emacs下学会查看编码系统很重要,这有利于编码问题的查找和解决。

查看编码系统中具体某个coding的说明

M-x describe-coding-system (C-h C coding RET)

查看当前正在使用的编码系统

M-x describe-coding-system (C-h C RET)

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Coding system for saving this buffer:
U -- utf-8-hfs-dos

Default coding system (for new files):
c -- chinese-gbk-dos (alias: gbk-dos cp936-dos windows-936-dos)

Coding system for keyboard input:
c -- chinese-gbk-unix (alias: gbk-unix cp936-unix windows-936-unix)

Coding system for terminal output:
c -- cp936 (alias of chinese-gbk)

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

Coding systems for process I/O:
encoding input to the process: U -- utf-8-hfs-dos

decoding output from the process: U -- utf-8-hfs

Defaults for subprocess I/O:
decoding: - -- undecided-dos (alias: dos)

encoding: - -- undecided-unix (alias: unix)

Priority order for recognizing coding systems when reading files:
1. chinese-gbk (alias: gbk cp936 windows-936)
2. iso-2022-cn (alias: chinese-iso-7bit)
3. chinese-big5 (alias: big5 cn-big5 cp950)
4. chinese-iso-8bit (alias: cn-gb-2312 euc-china euc-cn cn-gb gb2312)
5. utf-8 (alias: mule-utf-8)
6. iso-2022-7bit
7. iso-2022-8bit-ss2
8. emacs-mule
9. raw-text
10. iso-2022-jp (alias: junet)
11. in-is13194-devanagari (alias: devanagari)
12. utf-8-auto
13. utf-8-with-signature
14. utf-16
15. utf-16be-with-signature (alias: utf-16-be)
16. utf-16le-with-signature (alias: utf-16-le)
17. utf-16be
18. utf-16le
19. japanese-shift-jis (alias: shift_jis sjis)
20. undecided

其中:

  • Coding system for saving this buffer
    当前buffer的编码,M-x set-buffer-file-coding-system会改变这个编码。
  • Default coding system (for new files)
    默认编码,当打开新文件时会使用这个编码。
  • Coding system for keyboard input
    键盘输入编码,转换键盘输入的字符代码在一些特定终端是有用的,这些终端可能有发送非ASCII图形字符的按键。
  • Coding system for terminal output
    终端输出编码,这对于在某些仅字符终端上支持特定语言或者字符集是非常有用的。
  • Coding systems for process I/O
    和其它程序进行通信时的编码系统,包括输入编码和输出编码,可以使用M-x set-buffer-process-coding-system分别设置输入编码和输出编码,这个会在后面的使用经验中会提到。

最后列出了Emacs读文件时使用的编码优先级,从上面可以看到,打开文件的默认编码是gbk。

显示Emacs支持的所有编码系统

M-x list-coding-systems

提示
每一个编码系统都有三种形式,每一种形式都指明会做什么样的换行转换:

  • …-unix 不做换行转换;假设文件使用换行符分割每一行。
  • …-dos 假设使用回车换行符分割每一行,会做合适的转换。
  • …-mac 假设使用回车符分割每一行,会做合适的转换。

改变编码

更改编码系统优先级

M-x prefer-coding-system
此指令将选择的编码放到编码系统优先级队列的最前端。
如果想保持这个编码顺序(当Emacs关闭后再打开依然有效),在初始化文件中添加,例如设置utf-8为默认编码:

1
(prefer-coding-system 'utf-8)

设置文件存储的编码

M-x set-buffer-file-coding-system (C-x RET f coding RET)
设置当前buffer保存文件和重新访问文件的编码

变量buffer-file-coding-system:一旦Emacs为buffer选择了编码系统,会存储在此变量中。从buffer中保存文件会用到这个编码。可以通过M-x set-buffer-file-coding-system改变此变量值。
如果选择的编码不能处理所有的字符,在保存文件时,emacs不会用buffer-file-coding-system的值,而是选择更好的编码(通过M-x prefer-coding-system或者M-x set-language-environment设置的编码)。如果emacs选择的这个编码能安全的编码所有的字符,Emacs就用它,否则会显示一个适合编码这个buffer内容的编码列表,供用户选择。

设置文件显示的编码

M-x revert-buffer-with-coding-system (C-x RET r coding RET)
用选择的编码重新打开文件

设置下一个指令的编码

universal-coding-system-argument (C-x RET c coding RET)
如果在打开文件C-x C-f之前,调用此指令,会用选定的编码打开文件,也会用此编码保存文件;
如果在保存文件C-x C-w之前,调用此指令,会用选定的编码保存文件。
如果选用这种方式保存文件,与set-buffer-file-coding-system功能类似,只是如果遇到编码系统不能处理的字符,没有任何警告。

不做任何编码转换地查看文件

M-x find-file-literall
对于读或者写二进制文件,tar文件和其它必须逐字检查的文件有用。

总结

prefer-coding-system侧重于文件读,
set-buffer-file-coding-system侧重于文件写,
revert-buffer-with-coding-system侧重于文件显示

经验

Shell中与其它程序进行交互乱码问题

在Emacs的Shell中使用hexo创建新的文章

1
hexo new Emacs编码总结

时,会出现

1
2
hexo new Emacs缂栫爜鎬荤粨
INFO Created: d:\blog\source\_posts\Emacs缂傛牜鐖滈幀鑽ょ波.md

并且创建的文件名为乱码“Emacs缂栫爜鎬荤粨.md”

主要原因就是与hexo程序进行通信的编码没有设置正确,我当时设置的encoding input to the process是utf8,decoding output from the process设置的是chinese-gbk,在中文Windows下,操作系统使用的是gbk,因为输入到hexo程序中编码使用utf8,所以导致创建的文件名是乱码。所以通过M-x set-buffer-process-coding-system设置input是gbk就可以了。


版权声明

本博客 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可

本文永久链接:http://yoursite.com/2016/01/08/Emacs编码总结/