文章目录
在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
46Coding 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
2hexo 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就可以了。
版权声明