Posted on 06-11-2009
Filed Under (技术) by waterlin

重装系统后,Emacs 打开以前的文件,都显示为乱码,着实吓了我一跳。这个时候千万不要慌张,也不要随便地保存乱码的文件。

其实这只是 Emacs 读取文件的编码格式与你的文件格式不一样。我们可以用 M-x describe-coding-system 这个命令来查看一下 Emacs 是用什么编码来读取当前文件的。

比如说我的 org 文件都是用 UTF-8 来保存的,而打开某个 org 文件显示乱码,用命令 M-x describe-coding-system 显示当前解读的编码为:

  1 -- iso-latin-1-unix (alias: iso-8859-1-unix latin-1-unix)

Emacs 错把 UTF-8 的编码解读成了 latin 编码格式,难怪会乱码!

这个时候,有两种解决办法。

  1. 把 Emacs 的默认编码设置为 UTF-8。

    在 .emacs 文件里放入下面这段代码:

    ;;
                  set the default text coding system
    (setq default-buffer-file-coding-system 'utf-8)
    

    可是即使我加了上面这条语句,为什么 Emacs 依然显示 org 文件为乱码呢?

    原来上面这一行,只是适用于写文件的情况。当你读取一个文件的时候,可能依然会显示出乱码,因为 Emacs 读文件也是按照一定的编码规律来解读文件的。我们再用命令 M-x describe-coding-system 仔细观察一下结果里面的内容,是不是有类似下面这样一段:

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

    这就是 Emacs 在读文件时候的解码顺序!如果你的文件是以英文开头,自然会套用第一种方法。这个时候,我们还需要调整一下这个编码的先后次序。用命令 M-x prefer-coding-system 就可以调整这些顺序。调整完顺序,再打开 org 文件看一看,终于恢复原貌了。

    如果你只是用命令 M-x prefer-coding-system 来设置,下次重启 Emacs 的时候,这个设置就会自动清除。如果需要每次都采用这个设置,可以把下面这行扔到 .emacs 里指定优先用 utf-8 来解码:

    (prefer-coding-system 'utf-8)
    
  2. 另外一种解决乱码的办法,就是用命令 C-x <RET> r ( M-x revert-buffer-with-coding-system) 来用指定的编码重新读入这个文件。

另外,碰到文件编码混乱的时候,最重要的一点,看到乱码的文件,不要随便保存。有关 Emacs 编码格式的详情可以看看官方文档

原创文章,如转载请注明:转载自细节之锤 [ http://blog.WaterLin.org/ ]

Copyright © WaterLin.org. All rights reserved.

© 2009, 浏忙大爆炸. All rights reserved.
除非注明,浏忙大爆炸文章均为原创,转载请以链接形式标明本文地址。

Comments

xueyu on 29 November, 2009 at 2:45 am #

非常感谢

[Reply]


shengdoushi on 14 December, 2009 at 11:17 am #

学习了, 有些 cpp 打开就是源码. 难道 emacs 读文件的时候判断的编码还有bug, 其他的编辑器为什么就可以正常读取, 这一点尤其不爽

[Reply]


bc on 17 December, 2009 at 9:20 am #

是不是也可以用这个http://code.google.com/p/unicad/

[Reply]


[…] 前几天用设置 Emacs 文件系统的编码格式的方法,重新设定了 Emacs 默认的编码格式。 […]


emacs的文件编码转换 | Lupin's Blog on 9 April, 2011 at 2:39 pm #

[…] (转自:http://blog.waterlin.org/articles/set-emacs-default-coding-system.html) […]


Happy Emacs | 屋顶的猫 on 23 June, 2011 at 1:10 pm #

[…] (转自:http://blog.waterlin.org/articles/set-emacs-default-coding-system.html) […]


firegun on 15 August, 2011 at 1:41 pm #

写的好~

[Reply]


wind on 4 March, 2012 at 4:30 pm #

nice,thank you.

[Reply]


rst on 26 May, 2012 at 1:46 pm #

感谢啊~

[Reply]


rst on 29 May, 2012 at 12:59 pm #

感谢你的经验分享!

[Reply]


[…] 发现此博文写得更详细 […]


Post a Comment
Name:
Email:
Website:
Comments: